[英]Entity Framework IsSubmitting pattern?
我有很多方法最终可以调用我的this._context.SubmitChanges
方法。 因为我所有的方法都是异步操作的,所以在我的应用程序中(很可能不太可能),多个方法可能会在完成另一个commitchanges之前尝试提交。
现在,我知道我可以使用IsSubmitting方法来确保在出现另一个提交时不要尝试调用一个提交。 我只是想知道从这里往哪个方向走。 我不确定是否真的需要设置队列,因为希望提交更改的多个实体都将在.SubmitChanges调用下汇总。
我所做的每个Submitchange都有一个回调函数。 一种选择是在我的应用中抛出一个标志,该标志在回调中检查过渡期间是否设置了标志。 如果设置了标志,它将触发另一轮射击。 虽然似乎有点黑。 有没有更好的办法?
谢谢。
[编辑]
我没有想要的EF fu,但是我想将它们分开,如下面的代码所述(我的VM构造函数)...当我希望提交更改时,它就在每个独立的entityLists ...
这是一个提交更改的示例调用(每个调用使用不同的实体列表)
this._keywordSource.Add(new Keyword() { keyword = searchText });
if (this._context.Keywords.HasChanges && !this._context.IsSubmitting)
{
this._context.SubmitChanges(KeywordsAddedCompleted, null);
}
这是我的viewmodel构造函数的代码:
this._gnipRuleSource = new EntityList<GnipRule>(this._context.GnipRules);
this._keywordSource = new EntityList<Keyword>(this._context.Keywords);
this._cachedSource = new EntityList<CachedKeywordResult>(this._context.CachedKeywordResults);
this._feedSourceSource = new EntityList<FeedSource>(this._context.FeedSources);
this._gnipRuleLoader = new DomainCollectionViewLoader<GnipRule>(LoadGnipRules, LoadGnipRulesCompleted);
this._keywordLoader = new DomainCollectionViewLoader<Keyword>(LoadKeywords, LoadKeywordsCompleted);
this._cachedLoader = new DomainCollectionViewLoader<CachedKeywordResult>(LoadCachedKeywords, LoadCachedKeywordsCompleted);
this._feedSourceLoader = new DomainCollectionViewLoader<FeedSource>(LoadFeedSources, LoadFeedSourcesCompleted);
this._gnipRuleView = new DomainCollectionView<GnipRule>(this._gnipRuleLoader, this._gnipRuleSource);
this._keywordView = new DomainCollectionView<Keyword>(this._keywordLoader, this._keywordSource);
this._cachedView = new DomainCollectionView<CachedKeywordResult>(this._cachedLoader, this._cachedSource);
this._feedSourceView = new DomainCollectionView<FeedSource>(this._feedSourceLoader, this._feedSourceSource);
我在同一地方,正在考虑实施一个队列,因为我可以确保我的操作可靠且有序地提交。 我已经进行了一些研究,但还没有找到解决这种情况的好方法。
不过,您的回调模式看起来似乎很简单。 hacky缺乏结构,但是如果您确保所有提交都通过单个代码,那么它应该很容易实现和维护。 几乎肯定可以更快地实现这种排队模式。
检查IsSubmitting
并避免SubmitChanges
,以使未提交的更改被滚动到下一个称为(如您所描述的)提交中,可以很好地工作。 不幸的是,它最终将导致一些未提交的更改(由于IsSubmitting
为true,因此用户会话中的最后一个更改未被IsSubmitting
)。 如果发生这种情况,那将是“运气不好”,尤其是因为不可能快速进行多次提交,但是对于无法复制该错误的用户和测试人员而言,这将是非常烦人的。
这样的事情怎么样?
if (!_serviceContext.IsSubmitting)
{
_serviceContext.SubmitChanges();
}
else
{
PropertyChangedEventHandler propChangedDelegate = null;
propChangedDelegate = delegate
{
if (!_serviceContext.IsSubmitting)
{
_serviceContext.SubmitChanges();
_serviceContext.PropertyChanged -= propChangedDelegate;
}
};
_serviceContext.PropertyChanged += propChangedDelegate;
}
首先,我检查服务是否正在提交更改,如果是,则我订阅PropertyChanged事件以在IsSubmitting更改值时得到通知。 从我所见,它似乎可以解决问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.