将更改分组以保存在Entity Framework Core中

时间:2017-08-31 13:29:07

标签: c# entity-framework-core

我正在运行一个会影响用户数据库中的大量记录的进程。我只想根据所有更改的结果应用所有更改或不应用任何更改。 (例如,如果其中一个子流程失败,则不应发生总体变化)。我还想将通知保存到数据库以提醒用户进程的结果(例如,如果子进程失败,则会发出通知,让用户知道由于原因x没有进行任何更改)。

我认为这样做的最佳方式是在添加更改跟踪器时分离所有条目,然后在某些事情成功或失败时创建通知并保存更改,然后在应用所有更改时我可以迭代更改跟踪器并重置Entity State并再次保存更改。

我面对这种方法的问题是,在重置Entity State时,我不知道该实体是Added还是Modified 。我可以实现自己的更改跟踪器来存储实体的先前状态,但这会使EF的更改跟踪器变得多余。

我还可以在保存它们时添加所有实体,但这需要将许多对象沿嵌套方法的链接传递到最后。

是否有人有任何更好的建议,或者使用上述黑客之一解决此问题的标准做法是什么?

2 个答案:

答案 0 :(得分:1)

听起来您正在尝试实施工作单元模式。 EntityFramework的DbContext使其相当容易使用,因为DbContext其自己 是工作单元。

只需实例化一个新的上下文并进行所需的更改。您可以将上下文传递给任何进行更改的函数。完成“逻辑单元”操作后,请致电SaveChanges。只要各个方法不调用SaveChanges,就可以将它们组合在一起组成一个单元,一旦整个逻辑操作完成就会提交。一切都将在一次交易中以原子方式提交。数据不会处于不一致状态。

答案 1 :(得分:0)

你告诉过交易。 Using Transactions or SaveChanges(false) and AcceptAllChanges()?

您也可以在DB中实现数据版本。对我来说,它将更加轻松和正确(你必须始终只插入数据,永远不会更新.1对多)。在这种情况下,您只需删除最后的记录或将其标记为无效