我使用EntityFramework 4.1。
我想要实现的是,每当在FooEntity的实体上调用SaveChanges方法时,首先我要更新这些实体然后再删除。
我尝试覆盖下面的默认行为,但我无法实现我想要的:它在Db上更新。但不是DELETES。
我怎样才能做到这一点?
public override int SaveChanges()
{
var entitiesMarkedAsDelete = ChangeTracker.Entries<FooEntity>()
.Where(e => e.State==EntityState.Deleted);
foreach (var e in entitiesMarkedAsDelete)
{
e.State = EntityState.Modified;
}
base.SaveChanges(); // To enforce an UPDATE first
// Now, I try to re-mark them to DELETE
foreach (var e in entitiesMarkedAsDelete)
{
e.State = EntityState.Deleted;
}
base.SaveChanges(); // And hope that they will be deleted
// RESULT: 1st call of base.Savechanges() updates the entities
// but the 2nd call of base.Savechanges() does not make any changes on the UPDATED
// entities -and they are NOT DELETED.
}
答案 0 :(得分:1)
我认为你在这里被LINQ的懒惰本质所迷惑。
您在此处创建的序列:
var entitiesMarkedAsDelete = ChangeTracker.Entries<FooEntity>()
.Where(e => e.State==EntityState.Deleted);
每次迭代时都会对进行评估,所以第二次对它进行预测时,实际上并没有得到任何结果,因为已经没有处于已删除状态的实体了。
所以要解决这个问题,你只需要将序列传递给fx。列表,通过调用.ToList
:
var entitiesMarkedAsDelete = ChangeTracker.Entries<FooEntity>()
.Where(e => e.State==EntityState.Deleted).ToList();
这样两个foreach语句都会迭代相同的实体,并且应该正确删除它们。