2011-01-13 17 views
5

Jestem w trakcie dodawania audytu do mojej aplikacji EF4 (pierwszy model). Mogę uzyskać szczegółowe informacje na temat właściwości strukturalnych dla jednostek, które mają zmiany. Mogę też zobaczyć, kiedy nastąpiły zmiany w związku wielu do wielu. Widzę nazwę typów, które się z nimi wiążą i co się stało (dodawanie lub usuwanie), ale to, co naprawdę chciałbym, to identyfikatory podmiotów uczestniczących w zmianie relacji.EF4 Zmiany w inspekcji wielu do wielu relacji

Oto co obecnie mam do śledzenia zmian na wiele do wielu relacji:

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

Jak mogę uzyskać szczegóły (lub nawet rzeczywistych podmiotów) zaangażowanych w zmianę relacji?

UPDATE

Po wywiercenie się przez kilka godzin udało mi się znaleźć informacje potrzebne (patrz załączony obrazek). Jednak klasy przechowujące dane są wewnętrznymi klasami zapieczętowanymi i nie mogę znaleźć publicznego wpisu w celu wysłania zapytania do menedżera stanu obiektu, aby odzyskać te informacje. Mogę więc kontrolować zmianę.

alt text

+0

czy kiedykolwiek tego dowiedzieć? – DDiVita

+0

Nie, ale pamiętam, że opcja z @Icrepas wyglądała obiecująco, po prostu nie chciałem jej wypróbować. – ilivewithian

Odpowiedz

0

można uzyskać dostęp do dwóch obiektów EntityKey pośrednictwem właściwości CurrentValues ​​z RelationshipEntry (wywodzi się z ObjectStateEntry). Powinien dać ci to, czego potrzebujesz.

+0

Czy to nie jest wewnętrzna zapieczętowana klasa, czy też patrzę w niewłaściwą przestrzeń nazw? – ilivewithian

+0

@ilivewithian można uzyskać dostęp do 'CurrentValues' przy użyciu metody' dbContext.ChangeTracker.Entities() ', a następnie dla każdej zmienionej jednostki, będzie właściwość o nazwie" CurrentValues ​​". –

1

To może pomóc:

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... 
      } 
     } 
} 
Powiązane problemy