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

Jef*_*eff 9 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();
Run Code Online (Sandbox Code Playgroud)

如果取消注释AcceptAllChanges(),则不会删除对象.如果我保持评论,则删除实体.为什么EF表现得像这样?这似乎适得其反.

Lad*_*nka 17

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

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

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