2011-01-13 8 views
5

EF4(モデルファースト)アプリケーションに監査を追加する処理中です。私は変更があるエンティティの構造プロパティーについて詳しく知ることができます。私は、多対多の関係に変更があったときも見ることができます。私は関係するタイプの名前と何が起こったか(追加または削除)を見ることができますが、私が本当に好きなのは、関係の変更に関与するエンティティのIDです。ここでEF4多対多関係の変更の監査

は、私は現在、多くの関係に多くの変更を追跡するために持っているものです。

var changes = context.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Deleted | EntityState.Modified); 
var auditTime = DateTime.Now; 

foreach (var change in changes) 
{ 
    if (change.Entity != null && change.Entity.GetType().Equals(typeof(AuditTrail))) 
    { 
     continue; 
    } 

    var detailsBuilder = new StringBuilder(); 

    if (change.Entity == null & (change.State == EntityState.Added | change.State == EntityState.Deleted)) 
    { 
     detailsBuilder.Append("A link between entities "); 
     foreach (var changedMember in change.EntitySet.ElementType.KeyMembers) 
     { 
      detailsBuilder.AppendFormat("{0}", changedMember.Name); 
      if(change.EntitySet.ElementType.KeyMembers.IndexOf(changedMember) < change.EntitySet.ElementType.KeyMembers.Count -2) 
      { 
       detailsBuilder.Append(", "); 
      } 
      else if (change.EntitySet.ElementType.KeyMembers.IndexOf(changedMember) == change.EntitySet.ElementType.KeyMembers.Count - 2) 
      { 
       detailsBuilder.Append(" and "); 
      } 
     } 

     detailsBuilder.AppendFormat(" was {0}.<br />", change.State); 
    } 
} 

私は関係の変更に関わる詳細(あるいは実際の実体)を取得できますか?

私は、私は必要な情報を見つけるために管理している少数のより多くの時間のチャンスをうかがった後、UPDATE

(添付画像を参照してください)。しかし、データを格納するクラスは内部密閉クラスであり、この情報を返すためにオブジェクト状態マネージャに問い合わせるパブリックエントリを見つけることができません。だから私は変更を監査することができます。

alt text

+0

はあなたがこれを理解しましたか? – DDiVita

+0

いいえ、しかし、私は@Icrepasからの選択肢が有望であることを覚えています。 – ilivewithian

答えて

0

あなたはRelationshipEntry(ObjectStateEntryから派生)のCurrentValuesプロパティを介して2つのEntityKeyオブジェクトにアクセスすることができます。あなたに必要なものを与えるべきです。

+0

内部密閉クラスではないのですか、間違った名前空間を探していますか? – ilivewithian

+0

@ilivewithian 'dbContext.ChangeTracker.Entities()'メソッドを使用して 'CurrentValues'にアクセスすると、変更されたエンティティごとに' CurrentValues'という名前のプロパティがあります。 –

1

これはあなたを助けるかもしれない:

IEnumerable<IRelatedEnd> relatedEnds = ((IEntityWithRelationships) change.Entity).RelationshipManager.GetAllRelatedEnds(); 
foreach (var relatedEnd in relatedEnds) 
{ 
    foreach (var subEntity in relatedEnd) 
    { 
      if (subEntity is IEntityWithRelationships) 
      { 
      var entityAssociated = (IEntityWithRelationships)subEntity; 
      // Now you have your associated entity to work with... 
      } 
     } 
}