实体框架如何在保存要求所有实体
问题描述:
我使用实体框架添加属性和我有一些性能,这是通用于所有的实体:实体框架如何在保存要求所有实体
CreatedByUserName CreatedDateTime LastModifiedByUserName LastModifiedDatetime
所以目前我正在保存一个新的房产,我必须这样走:
_db.ProjectApprovals.Add(projectApproval);
projectApproval.CreatedByUserName = "Dev";
projectApproval.CreatedDateTime = DateTime.Now;
_db.SaveChanges();
正如你可以想象的那样:
projectApproval.CreatedByUserName = "Dev";
projectApproval.CreatedDateTime = DateTime.Now;
对于所有实体而言,每一次存储都是痛苦的。我正在考虑包装保存,然后我可以在那里做。问题是如何知道上下文中的哪些实体已被添加或修改。
答
首先你必须定义共享接口为所有的实体实施这些属性:
public interface IEntity
{
string CreatedByUserName { get; set; }
DateTime CreatedDateTime { get; set; }
...
}
在实体实现此接口,并在派生ObjectContext
覆盖SaveChanges
方法。
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);
}
这似乎是一个很好的方法,但我没有使用ObjectContext我正在使用似乎没有ObjectStateManager属性的DbContext。 – AnonyMouse
有'DbChangeTracker',或者您可以通过'IObjectContextAdapter'将'DbContext'转换为'ObjectContext'。 –