实体框架提交模式
本文关键字:模式 提交 框架 实体 | 更新日期: 2023-09-27 18:13:48
我有许多方法最终调用我的this._context.SubmitChanges
方法。因为我所有的方法都是异步操作的,所以在我的应用程序中有可能(尽管不太可能)多个方法可能在另一个提交更改完成之前尝试提交。
现在,我知道我可以使用issubmission方法来确保我不会在另一个提交发生时尝试调用一个提交。我只是想知道从这里往哪个方向走。我不确定是否真的有必要设置一个队列,因为寻求提交更改的多个实体都将在. submitchanges调用下进行汇总。
我对我所做的每个提交更改都有一个回调函数。一种选择是在我的应用程序中抛出一个标志,在回调中检查这个标志是否在过渡期间被设置。如果设置了旗子,它会发射另一发子弹。不过看起来有点寒酸。有没有更好的办法?
谢谢。[编辑]
我没有我想要的那么多EF,但我想我把它们分开,如下面的代码(我的VM构造函数)所述…当我想提交更改时,它是在这些独立的实体列表上…
下面是一个示例调用提交更改(其中每个调用使用不同的实体列表)
this._keywordSource.Add(new Keyword() { keyword = searchText });
if (this._context.Keywords.HasChanges && !this._context.IsSubmitting)
{
this._context.SubmitChanges(KeywordsAddedCompleted, null);
}
下面是我的视图模型构造函数的代码:
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);
我在同一个地方,我正在考虑实现一个队列,只是因为我可以确保我的操作被可靠地和有序地提交。我做了一些研究,但还没有找到一个好的模式来处理这种情况。
你的回调模式似乎是一个简单的解决方法。它缺乏结构,但如果你确保所有提交都通过一段代码,那么它应该很容易实现和维护。几乎可以肯定,实现排队模式会更快。
检查IsSubmitting
并避免SubmitChanges
,以使未提交的更改滚动到下一个称为(如您所描述的)的提交中。不幸的是,它最终会导致一些未提交的更改(用户会话中的最后一个更改没有持久化,因为当时IsSubmitting
为真)。当这种情况发生时,这将是"坏运气",特别是当多次提交不太可能很快发生时,但对于无法复制漏洞的用户和测试人员来说,这将是非常恼人的。
这样怎么样?
if (!_serviceContext.IsSubmitting)
{
_serviceContext.SubmitChanges();
}
else
{
PropertyChangedEventHandler propChangedDelegate = null;
propChangedDelegate = delegate
{
if (!_serviceContext.IsSubmitting)
{
_serviceContext.SubmitChanges();
_serviceContext.PropertyChanged -= propChangedDelegate;
}
};
_serviceContext.PropertyChanged += propChangedDelegate;
}
首先检查服务是否正在提交更改,如果是,则订阅PropertyChanged事件以在issubmitted更改值时获得通知。