Linq to Entity AcceptAllChanges SaveChanges

时间:2011-02-21 08:31:34

标签: c# entity-framework entity

以下内容之间有什么区别:

        db.AcceptAllChanges();
        // vs
        db.SaveChanges();

        db.AddToCustomer()
        // vs
        db.Customers.AddObject(Mycustomer);

以及db.Customers.DeleteObject(Mycustomer);db.DeleteFromCustomer(Mycustomer);

的原因 我应该何时使用每一个?

也是实体框架线程安全吗?我的意思是,如果两个线程在上下文中更新对象,它会崩溃吗?

提前致谢

2 个答案:

答案 0 :(得分:12)

db.AcceptAllChanges()假设您已完成任何关联的更改历史记录并将其丢弃 - 如果您有任何其他问题,则无法恢复这些更改。 db.SaveChanges(false)确实会将这些更改保留在内存中,以防出现问题。

请参阅http://blogs.msdn.com/b/alexj/archive/2009/01/11/savechanges-false.aspx以获得更深入的答案。

db.AddToCustomer()是围绕db.Customers.AddObject()的强类型包装器。看看它的定义,你会明白我的意思。我会纯粹使用db.AddToCustomer()方法,因为它是强类型的,并为您提供编译时类型检查。

我认为没有DeleteFromCustomer()的唯一原因是他们不认为工作是必要的(人们倾向于添加比他们删除的更多)。但是没有什么可以阻止你创建自己的扩展方法来自己实现它。

EF不是线程安全的,如果您想执行更新,您需要自己管理锁定。有关详情,请参阅http://blog.cincura.net/230902-multithreading-with-entity-framework/。)

答案 1 :(得分:9)

AcceptAllChanges仅将ObjectContextStateManager实例中的所有已添加和已修改实体设置为Unchanged状态,并分离所有已删除的实体,但它不会在数据库中执行更改。 SaveChanges执行数据库中的更改,默认情况下也接受更改(可以配置为不执行更改)。

AddToCustomerCustomers.AddObject相同 - 它只是一个快捷方式(与DeleteObject相同)。第一种方法是由代码生成器生成的(我认为它调用了第二种方法,它是ObjectSet的标准方法)。

实体框架不是线程安全的。此外,在多个主题中共享ObjectContext时,您应该very careful