我的数据库中的每个表都有一个CreatedDate和LastModifiedDate列。 EF中是否有一种方法可以分别在INSERT和UPDATE操作期间自动设置这些列?
我试图避免让人们试着记住在应用程序代码中手动设置它们,因为这容易出错。 (不,我不想在每张桌子上放置触发器。)
答案 0 :(得分:1)
如果您使用Generic Repository模式,则有一个简单的解决方案。 您可以使用以下代码添加实体
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);
}
答案 1 :(得分:1)
如果每个表中都有CreatedDate
和LastModifiedDate
,那么可能您有一些具有这两个属性的 abstract 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
。