【问题标题】:Entity Framework 6 SaveChanges() override not consistently detecting changes实体框架 6 SaveChanges() 覆盖未始终检测更改
【发布时间】:2016-02-05 19:42:49
【问题描述】:

我扩展了一个类,以便在对记录进行重大更改时将最后修改的时间戳添加到记录中。这是使用类似于this 的代码完成的。

这是我的问题。 SaveChanges() 正在为这两个更改触发,但第二个没有进入循环:没有检测到需要更改的对象。

但是,记录确实由 EF 通过 base.SaveChanges() 调用更新。

这是 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);            
    }
}

没有其他代码。没有奇怪的关闭/打开实体跟踪或任何东西。所见即所得。

我错过了什么?修改后的检查如何遗漏了明确修改的对象?

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    Annnd...当然是在和鸭子交谈之后回答了我自己的问题。

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

    这可以解决所有问题。感谢您的关注,我希望这对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-30
      • 1970-01-01
      • 2016-08-23
      • 1970-01-01
      相关资源
      最近更新 更多