Entity framework 有没有办法在EF中自动设置CreatedDate/LastModifiedDate列?

Entity framework 有没有办法在EF中自动设置CreatedDate/LastModifiedDate列?,entity-framework,Entity Framework,数据库中的每个表都有一个CreatedDate和LastModifiedDate列。EF中是否有方法分别在插入和更新操作期间自动设置这些列 我试图避免人们试图记住在应用程序代码中手动设置它们,因为这很容易出错。(不,我不想在每个表上都放置触发器。)如果使用通用存储库模式,有一个简单的解决方案。 您可以使用以下代码添加实体 public T Add(T entity) { typeof(T).GetField("CreatedDate").SetValue(entity,

数据库中的每个表都有一个CreatedDate和LastModifiedDate列。EF中是否有方法分别在插入和更新操作期间自动设置这些列


我试图避免人们试图记住在应用程序代码中手动设置它们,因为这很容易出错。(不,我不想在每个表上都放置触发器。)

如果使用通用存储库模式,有一个简单的解决方案。 您可以使用以下代码添加实体

 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);
    }

如果您使用通用存储库模式,那么有一个简单的解决方案。 您可以使用以下代码添加实体

 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);
    }

如果在每个表中都有
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();
}
private void SetOperationDates()
{
//获取添加的条目
IEnumerable addedEntryCollection=上下文
.ObjectContext
.ObjectStateManager
.GetObjectStateEntries(EntityState.Add)
其中(m=>m!=null和&m.Entity!=null);
//获取修改的条目
IEnumerable modifiedEntryCollection=上下文
.ObjectContext
.ObjectStateManager
.GetObjectStateEntries(EntityState.Modified)
其中(m=>m!=null和&m.Entity!=null);
//设置已添加项的CreatedDate
foreach(addedEntryCollection中的ObjectStateEntry条目)
{                
BaseModel AddIdentity=条目。实体作为BaseModel;
if(addedEntity!=null)
addedEntity.CreatedDate=DateTime.Now;
}
//设置已修改项的LastModifiedDate
foreach(modifiedEntryCollection中的ObjectStateEntry条目)
{
BaseModel modifiedEntity=entry.Entity作为BaseModel;
if(modifiedEntity!=null)
modifiedEntity.LastModifiedDate=DateTime.Now;
}
}
公共覆盖int SaveChanges()
{
SetOperationDates();
返回SaveChanges();
}

注意:如果每个表中都有
CreatedDate
LastModifiedDate
,您还可以添加带有
bool
参数的
SaveChanges
方法的重载版本,以防您不想调用
SetOperationDates
,然后可能会有一些抽象的
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();
}
private void SetOperationDates()
{
//获取添加的条目
IEnumerable addedEntryCollection=上下文
.ObjectContext
.ObjectStateManager
.GetObjectStateEntries(EntityState.Add)
其中(m=>m!=null和&m.Entity!=null);
//获取修改的条目
IEnumerable modifiedEntryCollection=上下文
.ObjectContext
.ObjectStateManager
.GetObjectStateEntries(EntityState.Modified)
其中(m=>m!=null和&m.Entity!=null);
//设置已添加项的CreatedDate
foreach(addedEntryCollection中的ObjectStateEntry条目)
{                
BaseModel AddIdentity=条目。实体作为BaseModel;
if(addedEntity!=null)
addedEntity.CreatedDate=DateTime.Now;
}
//设置已修改项的LastModifiedDate
foreach(modifiedEntryCollection中的ObjectStateEntry条目)
{
BaseModel modifiedEntity=entry.Entity作为BaseModel;
if(modifiedEntity!=null)
modifiedEntity.LastModifiedDate=DateTime.Now;
}
}
公共覆盖int SaveChanges()
{
SetOperationDates();
返回SaveChanges();
}

注意:如果您不想调用
SetOperationDates

是否先使用代码?是否先使用代码,您还可以添加带有
bool
参数的
SaveChanges
方法的重载版本?