2011-11-10 76 views
1

我使用实体框架添加属性和我有一些性能,这是通用于所有的实体:实体框架如何在保存要求所有实体

CreatedByUserName CreatedDateTime LastModifiedByUserName LastModifiedDatetime

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

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

正如你可以想象的那样:

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

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

回答

2

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

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

这似乎是一个很好的方法,但我没有使用ObjectContext我正在使用似乎没有ObjectStateManager属性的DbContext。 – AnonyMouse

+0

有'DbChangeTracker',或者您可以通过'IObjectContextAdapter'将'DbContext'转换为'ObjectContext'。 –