2013-09-22 51 views
3

我試圖在我的MVC 4中使用EF應用程序執行審覈,按照此帖http://jmdority.wordpress.com/2011/07/20/using-entity-framework-4-1-dbcontext-change-tracking-for-audit-logging/爲什麼DbEntityEntry的原始值與新值相匹配?

我在修改實體時無法找到更改的屬性。我有一個繼承自DbContext的類並重寫SaveChanges方法。在這個新的SaveChanges方法中,我有以下代碼來查找更改的屬性,其中實體來自ChangeTracker.Entities()。

foreach (var propertyName in entity.OriginalValues.PropertyNames) 
{ 
    var originalValue = entity.OriginalValues.GetValue<object>(propertyName); 
    var newValue = entity.CurrentValues.GetValue<object>(propertyName); 

    if (!object.Equals(originalValue, newValue)) 
    { 
     // Insert an auditing record. 
    } 
} 

這個問題是,originalValue總是等於newValue,即使還沒有保存到數據庫。我怎樣才能得到原始價值,以便我可以檢查財產是否已經改變?

在此先感謝!

+0

顯示您的客戶端代碼(即實際上改變了屬性值),您的滿'的SaveChanges()'代碼可以很好的幫助。 – haim770

+1

在檢查更改之前,您可能需要調用'context.ChangeTracker.DetectChanges' ... – qujck

回答

3

罪魁禍首是這行代碼:

DbSet.Attach(...)

此函數(從System.Data.Entity.IDbSet)的概要是:「將已給定實體的上下文中的組底層即,該實體是。放置在Unchanged狀態的上下文中,就好像它已經從數據庫中讀取一樣。「

+0

您是否可以更具體地瞭解實際上如何幫助獲取實體上的更改? – Jensen

+0

在檢查更改之前,有一些地方會清除所有更改的DbSet.Attach(實體)的調用 – kolesso

5

你可以這樣說:

foreach (var propertyName in entity.OriginalValues.PropertyNames) 
      { 
       String originalValue = ""; 
       String newValue = ""; 

       originalValue = entity.GetDatabaseValues().GetValue<object>(propertyName).ToString(); 

       newValue = entity.CurrentValues.GetValue<object>(propertyName).ToString(); 

       changes += propertyName.ToString() + " : " + originalValue + " --> " + newValue + "\n"; 
      } 
相關問題