2016-02-05 38 views
4

如果對記錄進行了重大更改,我已經擴展了一個類以便將最後修改的時間戳添加到記錄。這是用類似於this的代碼完成的。實體框架6 SaveChanges()重寫不一致地檢測更改

這是我的問題。 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);    
    } 
} 

沒有其他的代碼。關於實體追蹤或任何事情都沒有奇怪的結果。所見即所得。

我錯過了什麼?如何通過檢查Modified來清除修改的對象?

回答

0

Annnd ...回答了我自己的問題,當然,在與鴨子說話之後。

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

這修復了一切。感謝您的關注,我希望這可以幫助別人。

相關問題