0

我使用 EntityFramework 4.1。

我想要实现的是,每当对 FooEntity 的实体调用 SaveChanges 方法时,我首先要更新这些实体,然后再删除。

我尝试覆盖下面的默认行为,但我无法实现我想要的:它在 Db 上更新。但不是删除。

我怎样才能做到这一点?

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.

        }
4

1 回答 1

1

我认为您在这里被 LINQ 的懒惰性质所愚弄。

您在此处创建的序列:

var entitiesMarkedAsDelete = ChangeTracker.Entries<FooEntity>()
                             .Where(e => e.State==EntityState.Deleted);

.. 每次迭代时都会对其进行评估,因此第二次遍历它时,您实际上并没有得到任何结果,因为不再有实体处于已删除状态。

因此,要解决此问题,您只需将序列通过管道传输到 fx.xml 中即可。一个列表,通过调用.ToList它:

var entitiesMarkedAsDelete = ChangeTracker.Entries<FooEntity>()
                             .Where(e => e.State==EntityState.Deleted).ToList();

这样,两个 foreach 语句都将遍历相同的实体,并且应该正确删除它们。

于 2013-10-11T08:41:04.783 回答