我使用的是.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这样做?似乎有效果.
解决方法
那就是AcceptAllChanges的行为.接受更改“重置”ObjectContext的内部状态.这意味着添加或修改的所有实体都被设置为“不变”状态,所有被删除的实体都与上下文分离.
相比之下,SaveChanges方法迭代ObjectContext的内部状态,并为每个具有添加状态的实体创建INSERT数据库命令,每个被修改状态的实体都有UPDATE db命令,并且每个被删除状态的实体都使用DELETE db命令.默认情况下,SaveChanges在执行所有命令后接受所有更改.
如果在SaveChanges之前运行AcceptAllChanges,则清除所有更改,并且在DB中无法执行任何操作.存在此方法的原因是您可以关闭默认SaveChanges行为;在这种情况下,您必须在执行SaveChanges后手动接受更改.否则,下一次调用SaveChanges将再次执行更改.