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