以下内容之间有什么区别:
db.AcceptAllChanges();
// vs
db.SaveChanges();
db.AddToCustomer()
// vs
db.Customers.AddObject(Mycustomer);
以及db.Customers.DeleteObject(Mycustomer);
和db.DeleteFromCustomer(Mycustomer);
也是实体框架线程安全吗?我的意思是,如果两个线程在上下文中更新对象,它会崩溃吗?
提前致谢
答案 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
执行数据库中的更改,默认情况下也接受更改(可以配置为不执行更改)。
AddToCustomer
与Customers.AddObject
相同 - 它只是一个快捷方式(与DeleteObject
相同)。第一种方法是由代码生成器生成的(我认为它调用了第二种方法,它是ObjectSet
的标准方法)。
实体框架不是线程安全的。此外,在多个主题中共享ObjectContext
时,您应该very careful。