2011-11-10 150 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'。 –