我正在运行一个会影响用户数据库中的大量记录的进程。我只想根据所有更改的结果应用所有更改或不应用任何更改。 (例如,如果其中一个子流程失败,则不应发生总体变化)。我还想将通知保存到数据库以提醒用户进程的结果(例如,如果子进程失败,则会发出通知,让用户知道由于原因x没有进行任何更改)。
我认为这样做的最佳方式是在添加更改跟踪器时分离所有条目,然后在某些事情成功或失败时创建通知并保存更改,然后在应用所有更改时我可以迭代更改跟踪器并重置Entity State
并再次保存更改。
我面对这种方法的问题是,在重置Entity State
时,我不知道该实体是Added
还是Modified
。我可以实现自己的更改跟踪器来存储实体的先前状态,但这会使EF的更改跟踪器变得多余。
我还可以在保存它们时添加所有实体,但这需要将许多对象沿嵌套方法的链接传递到最后。
是否有人有任何更好的建议,或者使用上述黑客之一解决此问题的标准做法是什么?
答案 0 :(得分:1)
听起来您正在尝试实施工作单元模式。 EntityFramework的DbContext
使其相当容易使用,因为DbContext
其自己 是工作单元。
只需实例化一个新的上下文并进行所需的更改。您可以将上下文传递给任何进行更改的函数。完成“逻辑单元”操作后,请致电SaveChanges
。只要各个方法不调用SaveChanges
,就可以将它们组合在一起组成一个单元,一旦整个逻辑操作完成就会提交。一切都将在一次交易中以原子方式提交。数据不会处于不一致状态。
答案 1 :(得分:0)
你告诉过交易。 Using Transactions or SaveChanges(false) and AcceptAllChanges()?
您也可以在DB中实现数据版本。对我来说,它将更加轻松和正确(你必须始终只插入数据,永远不会更新.1对多)。在这种情况下,您只需删除最后的记录或将其标记为无效