繁体   English   中英

实体框架IsSubmitting模式?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM