我已经扩展了一个类,以便在记录发生重大更改时将最后修改的时间戳添加到记录中.这是使用类似于
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();
这解决了一切.感谢您的关注,我希望这有助于其他人.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。