2011-05-17 124 views
3

我想添加一個存儲當前日期時間的記錄保存到磁盤時的列。什麼是實現這一目標的最佳方式?如何創建/更新EF代碼中的LastModified字段首先

我知道這不是一個非常複雜的問題,但我不知道是否有任何的最佳做法或會簡化任務EF的任何特徵。 例如:

  • 有沒有什麼辦法,包括爲表類中該領域的邏輯,這樣,每當它保存到磁盤它會自動更新?
  • 當對象被修改或保存時是否有任何事件需要捕獲?

回答

2

一個選項是創建存儲庫層和實現自己的SaveChanges

public void SaveChanges() 
{ 
    foreach (var entry in Context.ChangeTracker.Entries<ICreatedAt>().Where(x => x.State == EntityState.Added && x.Entity.CreatedAt == default(DateTime))) 
      entry.Entity.CreatedAt = DateTime.Now; 

    foreach (var entry in Context.ChangeTracker.Entries<ICreatedBy>().Where(x => x.State == EntityState.Added && x.Entity.CreatedBy == null)) 
     entry.Entity.CreatedBy = ContextManager.CurrentUser; 

    foreach (var entry in Context.ChangeTracker.Entries<IModifiedAt>().Where(x => x.State == EntityState.Modified)) 
     entry.Entity.ModifiedAt = DateTime.Now; 

    foreach (var entry in Context.ChangeTracker.Entries<IModifiedBy>().Where(x => x.State == EntityState.Modified)) 
     entry.Entity.ModifiedBy = ContextManager.CurrentUser; 

    Context.SaveChanges(); 
} 
+0

這是很多接口來實現,但它應該工作。 – hazimdikenli 2011-05-17 14:12:09

+0

這是一個有趣的解決方案,但我期望簡化我們的代碼! :)我們將繼續手動更新我們當前應用程序中的字段(它只是一個表格,並且只能從幾個位置保存)。無論如何,通過查看代碼,我學到了一些東西,它總是很棒的! (這可能是未來項目的一個很好的解決方案)。謝謝! – salgiza 2011-05-18 09:58:11

0

不幸的是,沒有您可以訂閱的事件。我的建議是覆蓋在您的上下文SaveChanges方法,做你的自定義邏輯存在(如果你要保持乾淨,你可以公開自己的事件)

編輯

一個解決方案,我挑了這是讓我所有的實體從一個共同的基類(如EntityBase)暴露方法BeforeSave()和AfterSave(),你可以在自定義的DbContext覆蓋SaveChanges方法時調用繼承(看ChangeTracker所有修改的條目)