实体框架如何在所有实体所需的保存期间添加属性

时间:2011-11-10 00:17:45

标签: entity-framework

我正在使用实体框架,并且我有一些对所有实体都通用的属性:

CreatedByUserName CreatedDateTime LastModifiedByUserName LastModifiedDatetime

所以目前我正在保存一个新房产,我必须这样:

_db.ProjectApprovals.Add(projectApproval);
                    projectApproval.CreatedByUserName = "Dev";
                    projectApproval.CreatedDateTime = DateTime.Now;
                    _db.SaveChanges();

你可以想象不得不这样做:

projectApproval.CreatedByUserName = "Dev";
                        projectApproval.CreatedDateTime = DateTime.Now;

对于所有实体,每次保存都是一种痛苦。我想要包装保存然后我可以在那里做。问题是如何知道上下文中的哪些实体已被添加或修改。

1 个答案:

答案 0 :(得分:2)

首先,您必须为实现这些属性的所有实体定义共享接口:

public interface IEntity
{
    string CreatedByUserName { get; set; }
    DateTime CreatedDateTime { get; set; }
    ...
}

在您的实体中实施此界面,并覆盖派生SaveChanges中的ObjectContext方法。

public override int SaveChanges(SaveOptions saveOptions)
{
    var entries = this.ObjectStateManager
                      .GetObjectStateEntries(EntityState.Added | EntityState.Modified)
                      .Where(x => !x.IsRelationship && x.Entity is IEntity);

    foreach (var entry in entiries)
    {
       var entity = entry.Entity as IEntity;

       if (entry.State == EntityState.Added)
       {
          ...
       } 
       else
       { 
          ...
       }
    }


    return SaveChagnes(saveOptions);
}