2011-01-13 14 views
5

Estoy en el proceso de agregar auditoría a mi aplicación EF4 (modelo primero). Puedo obtener los detalles sobre las propiedades estructurales en las entidades que tienen cambios. También puedo ver cuándo ha habido cambios en una relación de muchos a muchos. Puedo ver el nombre de los tipos involucrados y lo que sucedió (agregar o eliminar) pero lo que realmente me gustaría es identificar las entidades que están involucradas en el cambio de relación.EF4 Cambios de auditoría de muchas a muchas relaciones

Aquí es lo que tengo actualmente para el seguimiento de cambios de relaciones muchos a muchos:

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

¿Cómo puedo obtener los detalles (o incluso las entidades reales) que participan en el cambio de relación?

ACTUALIZACIÓN

Después de hurgar durante unas cuantas horas más he logrado encontrar la información que necesito (ver imagen adjunta). Sin embargo, las clases que almacenan los datos son clases internas selladas y no puedo encontrar una entrada pública para consultar al administrador de estado del objeto para recuperar esta información. Entonces puedo auditar el cambio.

alt text

+0

¿alguna vez resolver esto? – DDiVita

+0

No, pero recuerdo que la opción de @Icrepas parecía prometedora, simplemente no pude probarla. – ilivewithian

Respuesta

0

Se puede acceder a los dos objetos EntityKey través de la propiedad de un CurrentValues ​​RelationshipEntry (deriva de ObjectStateEntry). Debería darte lo que necesitas.

+0

¿No es una clase sellada interna, o estoy buscando en el espacio de nombres incorrecto? – ilivewithian

+0

@ilivewithian puede acceder a 'CurrentValues' utilizando el método' dbContext.ChangeTracker.Entities() ', luego para cada entidad modificada, habrá una propiedad llamada' CurrentValues'. –

1

Esto podría ayudarle a cabo:

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