2011-11-10 11 views
1

私は、エンティティフレームワークを使用していると私はすべてのエンティティに共通するいくつかの性質を持っている: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; 

保存するたびに苦労します。私はセーブをラップすることを考えていましたし、そこで私はそれを行うことができました。問題は、コンテキスト内のどのエンティティが追加または変更されたかをどのように知るかです。

答えて

2

まず第一に、あなたは、これらのプロパティを実装するすべてのエンティティの共有インターフェイスを定義する必要があります。

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

はあなたのエンティティで、このインタフェースを実装し、あなたの派生ObjectContextSaveChangesメソッドをオーバーライドします。

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'に変換することができます。 –