23

_context.SaveChanges和之间的区别_context.AcceptAllChanges()AcceptAllChanges()从数据库重新加载数据或回滚(丢弃)用户在不使用时所做的更改SaveChanges()

4

2 回答 2

28

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 执行必要的数据库命令,但保留更改,以便在必要时重播它们。

现在,如果更广泛的事务失败,您可以重试 EF 特定位,并再次调用 SaveChanges(false)。或者,您可以通过状态管理器记录失败的内容。

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

于 2012-10-12T12:42:18.610 回答
3

从使用 Microsoft .Net Framework 4 访问数据一书中:

使用实体框架时,当您在 ObjectContext 对象上调用 SaveChanges 方法时,会在事务中自动处理向数据库提交的更改。另外,如果更新时没有抛出异常,则会自动调用 AcceptAllChanges 方法,这会将所有对象的状态重置为 Unchanged。尽管 SaveChanges 方法是在事务中执行的,但如果您需要在同一事务中执行其他操作,则可能需要创建自己的事务

于 2012-10-12T12:44:20.470 回答