2011-01-13 6 views
5

EF4 (model ilk) uygulamasına denetim ekleme sürecindeyim. Değişikliklerdeki varlıklar üzerindeki yapısal özellikler hakkında detayları alabilirim. Birçok ilişkide ne zaman değişiklikler olduğunu görebilirim. Dahil olan türlerin ismini ve ne olduğunu (ekleme veya kaldırma) görebilirim ama gerçekten sevdiğim şey, ilişkide değişiklik yapan tarafların kimlikleridir. İşteEF4 Pek çok - çok sayıda ilişkide denetim değişiklikleri

Şu anda birçok ilişkilere birçok değişiklik izleme ne var:

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

nasıl ilişki değişikliğine ilgili ayrıntıları (veya hatta gerçek varlıkları) alabilirim?

İhtiyacım bilgiyi bulmak için başarmış birkaç saat daha üzerinde kurcalama sonra GÜNCELLEME

(ekli resme bakın). Ancak, verileri depolayan sınıflar iç mühürlü sınıflardır ve bu bilgileri geri almak için nesne durumu yöneticisini sorgulamak için genel bir giriş bulamıyorum. Bu yüzden değişimi denetleyebilirim.

alt text

+0

Hiç bu anlamaya mı? – DDiVita

+0

Hayır, ama @Icrepas'ın ümit vaat ettiği seçeneği hatırlıyorum, denemeye henüz başlamamıştım. – ilivewithian

cevap

0

Bir RelationshipEntry (ObjectStateEntry türetilmiştir) ait CurrentValues ​​özelliği üzerinden iki EntityKey nesnelere erişebilir. Sana ihtiyacın olanı vermeli.

+0

Bu bir iç mühürlü sınıf değil mi, yoksa yanlış ad alanına mı bakıyorum? – ilivewithian

+0

@ilivewithian 'dbContext.ChangeTracker.Entities()' yöntemini kullanarak 'CurrentValues' öğesine erişebilir, sonra değiştirilen her varlık için' CurrentValues' adlı bir özellik olacaktır. –

1

Bu size yardımcı olabilir:

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... 
      } 
     } 
}