C# Linq到实体接受更改保存更改
以下各项之间的区别是什么:C# Linq到实体接受更改保存更改,c#,entity-framework,entity,C#,Entity Framework,Entity,以下各项之间的区别是什么: db.AcceptAllChanges(); // vs db.SaveChanges(); db.AddToCustomer() // vs db.Customers.AddObject(Mycustomer); 为什么会有db.Customers.DeleteObject(Mycustomer)和否db.DeleteFromCustomer(Mycustomer)
db.AcceptAllChanges();
// vs
db.SaveChanges();
db.AddToCustomer()
// vs
db.Customers.AddObject(Mycustomer);
为什么会有db.Customers.DeleteObject(Mycustomer)代码>和否db.DeleteFromCustomer(Mycustomer)代码>
我应该什么时候使用每一个
实体框架也是线程安全的吗?我的意思是,如果两个线程在sametime上下文中更新对象,它会崩溃吗
提前感谢接受更改
仅将ObjectContextStateManager
实例中所有添加和修改的实体设置为未更改
状态并分离所有删除的实体,但它不执行数据库中的更改<代码>保存更改
执行数据库中的更改,默认情况下还接受更改(可以配置为不接受更改)
AddToCustomer
与客户相同。AddObject
-它只是一个快捷方式(与DeleteObject
相同)。第一个方法由代码生成器生成(我认为它调用了第二个方法,这是ObjectSet
的标准方法)
实体框架不是线程安全的。此外,在多个线程之间共享ObjectContext
时,您也应该这样做。db.AcceptAllChanges()
假设您已经完成了任何关联的更改历史记录,并将其丢弃-如果您有任何进一步的问题,则无法恢复这些更改db.SaveChanges(false)
会将这些更改保留在内存中,以防出现问题
有关更深入的答案,请参阅
db.AddToCustomer()
是围绕db.Customers.AddObject()
的强类型包装。看看它的定义,你就会明白我的意思了。我将使用db.AddToCustomer()
方法,因为它是强类型的,并提供编译时类型检查
我想没有DeleteFromCustomer()
的唯一原因是他们认为这项工作没有必要(人们倾向于添加多于删除)。但是,没有什么可以阻止您创建自己的扩展方法来自己实现它
EF不是线程安全的,如果要执行更新,需要自己管理锁定。有关更多信息,请参见:)AddObject也是强类型的,因为它是泛型类型ObjectSet的方法-在本场景中,ObjectSet和方法的定义是AddObject(客户实体)。