2016-09-06 73 views
0

我的數據庫中的每個表都有一個CreatedDate和LastModifiedDate列。 EF中有一種方法分別在INSERT和UPDATE操作期間自動設置這些列嗎?有沒有辦法在EF中自動設置CreatedDate/LastModifiedDate列?

我試圖避免讓人們嘗試記住在應用程序代碼中手動設置它們,因爲這很容易出錯。 (不,我不想把觸發器放在每張桌子上。)

+0

您是先使用代碼嗎? –

回答

1

如果你有CreatedDateLastModifiedDate每個表中,那麼很可能你有一些抽象BaseModel具有這些兩個屬性。然後,你可以重寫你的上下文中SaveChanges方法和設置這些屬性:

private void SetOperationDates() 
{ 
    // Get added entries 
    IEnumerable<ObjectStateEntry> addedEntryCollection = Context 
     .ObjectContext 
     .ObjectStateManager 
     .GetObjectStateEntries(EntityState.Added) 
     .Where(m => m != null && m.Entity != null); 

    // Get modified entries 
    IEnumerable<ObjectStateEntry> modifiedEntryCollection = Context 
     .ObjectContext 
     .ObjectStateManager 
     .GetObjectStateEntries(EntityState.Modified) 
     .Where(m => m != null && m.Entity != null); 

    // Set CreatedDate of added entries 
    foreach (ObjectStateEntry entry in addedEntryCollection) 
    {     
     BaseModel addedEntity = entry.Entity as BaseModel; 
     if (addedEntity != null) 
      addedEntity.CreatedDate = DateTime.Now; 
    } 

    // Set LastModifiedDate of modified entries 
    foreach (ObjectStateEntry entry in modifiedEntryCollection) 
    { 
     BaseModel modifiedEntity = entry.Entity as BaseModel; 
     if (modifiedEntity != null) 
      modifiedEntity.LastModifiedDate = DateTime.Now; 
    } 
} 

public override int SaveChanges() 
{ 
    SetOperationDates(); 

    return SaveChanges(); 
} 

注意:您還可以在添加的情況下的方法SaveChanges超載版本蒙山bool參數你不想打電話SetOperationDates

1

如果您使用通用存儲庫模式,那麼有一個簡單的解決方案。 您可以使用下面的代碼添加實體

public T Add(T entity) 
    { 
     typeof(T).GetField("CreatedDate").SetValue(entity, DateTime.Now); 
     return this.DbSet.Add(entity); 
    } 

和更新實體像下面

public virtual void Edit(T entity) 
    { 
     typeof(T).GetField("LastModifiedDate").SetValue(entity, DateTime.Now); 
     this.Context.Edit(entity); 
    } 
相關問題