加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 实体框架6 SaveChanges()覆盖不一致地检测更改

发布时间:2020-12-15 20:58:13 所属栏目:百科 来源:网络整理
导读:我已经扩展了一个类,以便在记录发生重大更改时将最后修改的时间戳添加到记录中.这是使用类似于 this的代码完成的. 这是我的问题. SaveChanges()正在为两个更改触发,但第二个没有进入循环:没有检测到对象需要更改. 但是,EF会通过base.SaveChanges()调用更新
我已经扩展了一个类,以便在记录发生重大更改时将最后修改的时间戳添加到记录中.这是使用类似于 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);            
    }
}

没有其他代码.实体跟踪或任何事情都没有奇怪的关闭/开启.所见即所得.

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

解决方法

安德……当然,在与鸭子交谈之后回答了我自己的问题.

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

这解决了一切.感谢您的关注,我希望这有助于其他人.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读