2011-08-03 106 views
0

我使用Override Save Changes問題中的代碼在我的應用程序中實現審計。當一個實體被添加時,一切都很好。但是,當實體被修改時,「CreatedOn」日期從不加載。實體框架4.1 DbContext覆蓋SaveChanges屬性不加載

它始終爲空,所以最初的「CreatedOn」日期從數據庫中刪除。

我也嘗試查看存儲在實體中的OriginalValues集合,併爲「ModifiedOn」日期填充它,但不填寫「CreatedOn」日期。這兩個字段都填充到數據庫中...爲什麼一個會被EF加載,一個不會被加載?

public override int SaveChanges() 
    { 
     var changeSet = ChangeTracker.Entries<IAuditable>(); 

     if (changeSet != null) 
     { 
      foreach (DbEntityEntry<IAuditable> entry in changeSet) 
      { 
       switch (entry.State) 
       { 
        case EntityState.Added: 
         entry.Entity.CreatedOn = DateTime.Now; 
         entry.Entity.ModifiedOn = DateTime.Now; 
         break; 
        case EntityState.Modified: 
         entry.Entity.ModifiedOn = DateTime.Now; 

         //entry.Entity.CreatedOn date always null here 
         break; 
       } 
      } 
     } 

     return base.SaveChanges(); 
    } 
+0

您是否找到了解決方案?今天我碰到了和你一樣的問題,只是在我的情況下,它是'UpdatedBy' /'UpdatedById',它是空的。有趣的是,'UpdatedOn'工作得很好,即使當我檢查SSMS中的行時,'UpdatedOn'或'UpdatedById'都不爲NULL。我想知道審計字段是否以某種方式相互衝突,只要他們三個指向同一實體... –

+1

我從來沒有找到一個解決方案 - 我最終結束了重新加載創建的日期從數據庫保存前。不理想的額外數據庫調用,但它的工作原理。 – Neil

+1

昨晚我一直在挖掘這個,發現它是DBSet.Remove(entity)什麼將我的屬性設置爲null(甚至在調用'SaveChanges()'之前)。這顯然是[由設計](http://stackoverflow.com/a/6782744/88709),這是一種恥辱,因爲我最終不得不將邏輯上移到我的存儲庫。我寧願在DbContext中實現軟刪除,因爲它更幹。無論如何感謝您的更新! –

回答

2

也許您在MVC環境中使用?如果是這樣,也許只是因爲你沒有將你的實體屬性CreatedOn和ModifiedOn放在頁面的隱藏字段中。我遇到了這個問題,我用局部視圖解決了它。

/*My Partial View View/Shared/HiddenSystemValues.cshtml */ 
@model Models.IAuditable 
@Html.HiddenFor(model => model.CreatedOn) 
@Html.HiddenFor(model => model.ModifiedOn) 
... 


/*In All My Pages */ 
... 
@Html.Partial("HiddenSystemValues") 
... 
相關問題