AcceptAllChanges导致实体框架......不接受更改?

时间:2011-02-21 20:41:05

标签: c# linq entity-framework

我正在使用.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表现得像这样?这似乎适得其反。

1 个答案:

答案 0 :(得分:17)

这是AcceptAllChanges的行为。接受更改会“重置”ObjectContext的内部状态。这意味着添加或修改的所有实体都设置为“未更改”状态,并且已删除的所有实体都与上下文分离。

相反,SaveChanges方法迭代ObjectContext的内部状态,并为每个实体创建INSERT数据库命令,状态为添加,UPDATE db命令用于每个实体已删除状态中的每个实体的已修改状态和DELETE db命令。默认情况下,SaveChanges会在执行所有命令后接受所有更改。

如果在AcceptAllChanges之前运行SaveChanges,则清除所有更改,并且在DB中无需执行任何操作。此方法存在的原因是您可以关闭默认的SaveChanges行为;在这种情况下,您必须在执行SaveChanges后手动接受更改。否则,对SaveChanges的下一次调用将再次执行更改。