我的數據庫中的每個表都有一個CreatedDate和LastModifiedDate列。 EF中有一種方法分別在INSERT和UPDATE操作期間自動設置這些列嗎?有沒有辦法在EF中自動設置CreatedDate/LastModifiedDate列?
我試圖避免讓人們嘗試記住在應用程序代碼中手動設置它們,因爲這很容易出錯。 (不,我不想把觸發器放在每張桌子上。)
我的數據庫中的每個表都有一個CreatedDate和LastModifiedDate列。 EF中有一種方法分別在INSERT和UPDATE操作期間自動設置這些列嗎?有沒有辦法在EF中自動設置CreatedDate/LastModifiedDate列?
我試圖避免讓人們嘗試記住在應用程序代碼中手動設置它們,因爲這很容易出錯。 (不,我不想把觸發器放在每張桌子上。)
如果你有CreatedDate
和LastModifiedDate
每個表中,那麼很可能你有一些抽象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
。
如果您使用通用存儲庫模式,那麼有一個簡單的解決方案。 您可以使用下面的代碼添加實體
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);
}
您是先使用代碼嗎? –