Linq to Entity AcceptAllChanges SaveChanges

Sta*_*ker 13 c# entity entity-framework

以下是有什么区别的:

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

        db.AddToCustomer()
        // vs
        db.Customers.AddObject(Mycustomer);
Run Code Online (Sandbox Code Playgroud)

为什么有db.Customers.DeleteObject(Mycustomer); 和没有db.DeleteFromCustomer(Mycustomer);

我何时应该使用每一个?

也是实体框架线程安全?我的意思是如果两个线程在同一时间更新对象中的对象会崩溃吗?

提前致谢

Dun*_*tts 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/


Lad*_*nka 9

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

AddToCustomer是一样的Customers.AddObject- 它只是一个捷径(与之相同DeleteObject).第一种方法是由代码生成器生成的(我认为它调用第二种方法是标准方法ObjectSet).

实体框架不是线程安全的.此外,在多个线程之间共享时应该非常小心ObjectContext.