我正在使用.NET 3.5 SP1。我有一个删除一些实体的简单脚本。
var people = (from Person p in context.People
where p.FirstName == "Testy" &&
p.LastName == "McTesterson"
select p).ToList();
people.ForEach(p => context.DeleteObject(p));
//context.AcceptAllChanges();
context.SaveChanges();
如果我取消注释AcceptAllChanges()
,则不会删除对象。如果我保持评论,则删除实体。为什么EF表现得像这样?这似乎适得其反。
答案 0 :(得分:17)
这是AcceptAllChanges
的行为。接受更改会“重置”ObjectContext
的内部状态。这意味着添加或修改的所有实体都设置为“未更改”状态,并且已删除的所有实体都与上下文分离。
相反,SaveChanges
方法迭代ObjectContext
的内部状态,并为每个实体创建INSERT数据库命令,状态为添加,UPDATE db命令用于每个实体已删除状态中的每个实体的已修改状态和DELETE db命令。默认情况下,SaveChanges
会在执行所有命令后接受所有更改。
如果在AcceptAllChanges
之前运行SaveChanges
,则清除所有更改,并且在DB中无需执行任何操作。此方法存在的原因是您可以关闭默认的SaveChanges
行为;在这种情况下,您必须在执行SaveChanges
后手动接受更改。否则,对SaveChanges
的下一次调用将再次执行更改。