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(); 这解决了一切.感谢您的关注,我希望这有助于其他人. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |