在Entity Framework中,SaveChanges和AcceptAllChanges有什么区别?

25
_context.SaveChanges_context.AcceptAllChanges()有什么区别?AcceptAllChanges()是从数据库重新加载数据还是在用户没有使用SaveChanges()时回滚(放弃)所做的更改?
2个回答

30

ObjectContext.AcceptAllChanges方法 - MSDN

如果调用了SaveChanges方法,并且未指定AcceptAllChangesAfterSave,则用户必须调用AcceptAllChanges方法。在事务失败并且用户想要重试的情况下,AcceptAllChanges方法非常有用。

你可能会看到这个链接:http://blogs.msdn.com/b/alexj/archive/2009/01/11/savechanges-false.aspx

如果调用SaveChanges()或SaveChanges(true),EF仅假设其工作正常完成,就会丢弃它已经跟踪的更改,并等待新的更改。

不幸的是,如果交易的其他地方出现问题,由于EF丢弃了其正在跟踪的更改,我们无法恢复。

这就是SaveChanges(false)和AcceptAllChanges()发挥作用的地方。

SaveChanges(false)告诉EF执行必要的数据库命令,但保留更改以便在必要时可以重放。

现在,如果更广泛的事务失败,则可以使用另一个调用SaveChanges(false)来重试EF特定的位。或者,您可以通过状态管理器遍历日志记录失败的内容。

一旦更广泛的交易成功,您只需手动调用AcceptAllChanges(),正在跟踪的更改将被丢弃。


3

来自《使用Microsoft .Net Framework 4访问数据》的书:

当使用Entity Framework时,在调用ObjectContext对象上的SaveChanges方法时,将自动处理向数据库提交更改。此外,如果在更新时没有引发异常,AcceptAllChanges方法也会自动调用,这将重置所有对象的状态为Unchanged。虽然SaveChanges方法在事务中执行,但如果需要在同一事务中执行其他操作,则可能需要创建自己的事务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接