Entity Framework 6的SaveChanges()重写不一致地检测到更改

4
我为了在记录被更改时添加上一个最新的修改时间戳,扩展了一个类。类似于这里的代码完成了这个操作。
我的问题是SaveChanges()会对两次更改都进行检测,但第二次更改并没有进入循环:没有对象被检测到需要更改。
然而,通过base.SaveChanges()调用,EF确实更新了这条记录。
下面是MasterTable的扩展部分:
namespace AuditTestEF
{
    public interface IHasAuditing
    {
        DateTime LastModifiedOn { get; set; }
        int LastModifiedBy { get; set; }
    }

    public partial class MasterTable : IHasAuditing
    {
    }

    public class AuditTestEntitiesWithAuditing : AuditTestEntities
    {
        public int TestingUserIs = 1;

        public override int SaveChanges()
        {
            foreach (ObjectStateEntry entry in (this as IObjectContextAdapter)
                .ObjectContext
                .ObjectStateManager
                .GetObjectStateEntries(EntityState.Added | EntityState.Modified))
            {
                // This loop is entered the first time, but not the second
                if (entry.IsRelationship) continue;

                var lastModified = entry.Entity as IHasAuditing;
                if (lastModified == null) continue;

                lastModified.LastModifiedOn = DateTime.UtcNow;
                lastModified.LastModifiedBy = TestingUserIs;
            }

            return base.SaveChanges();
        }
    }
}

以下是测试工具:

[TestMethod]
public void TestMethod1()
{
    MasterTable mtOriginal;
    using (var audit = new AuditTestEntitiesWithAuditing())
    {
        var message = "Hello";
        audit.TestingUserIs = 1;
        mtOriginal = new MasterTable {TextField = message};
        audit.MasterTable.Add(mtOriginal);
        audit.SaveChanges();
        // This test passes, TestingUser is set in the override
        Assert.IsTrue(mtOriginal.LastModifiedBy == audit.TestingUserIs);    
    }

    using (var audit = new AuditTestEntitiesWithAuditing())
    {
        var mt = audit.MasterTable.Find(mtOriginal.MasterTableId);
        mt.TextField = "Goodbye";
        audit.TestingUserIs = 4;
        audit.SaveChanges();
        // This test fails, the record is written with "Goodbye" but
        // GetObjectStateEntries(EntityState.Added | EntityState.Modified) has no entries.
        Assert.IsTrue(mt.LastModifiedBy == audit.TestingUserIs);            
    }
}

这里没有其他代码。也没有奇怪的关闭/开启实体跟踪或其他什么东西。所见即所得。

我错过了什么?为什么明显修改过的对象被修改检查忽略了?

1个回答

1

和鸭子交谈后,我自己回答了我的问题。

    public override int SaveChanges()
    {
        ChangeTracker.DetectChanges();

这解决了所有问题。感谢您的关注,希望这能帮助其他人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接