2011-01-13 154 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屬性訪問兩個的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... 
      } 
     } 
}