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

时间:2016-09-06 06:49:53

标签: entity-framework

我的数据库中的每个表都有一个CreatedDate和LastModifiedDate列。 EF中是否有一种方法可以分别在INSERT和UPDATE操作期间自动设置这些列?

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

2 个答案:

答案 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)

如果每个表中都有CreatedDateLastModifiedDate,那么可能您有一些具有这两个属性的 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