5

que tiene algo como esto:DbContext ChangeTracker: Id del Agregado Entidad de Auditoría

public override int SaveChanges() 
{ 
    foreach (var changeLog in this.ChangeTracker.Entries() 
     .Where(p => p.State == EntityState.Added || 
       p.State == EntityState.Deleted || 
       p.State == EntityState.Modified) 
     .SelectMany(entity => AuditRecords(entity))) 
    { 
     this.ChangeLogs.Add(changeLog); 
    } 

    return base.SaveChanges(); 
} 

Pero, por supuesto, registros de cambios auditados no contendrán el valor de clave principal de la entidad cuando el EntityState está añadida (hasta después de SaveChanges). ¿Cómo puedo obtener el valor de la clave primaria para fines de auditoría de cambio?

Richard

Respuesta

5

me gustaría almacenar las referencias a las entidades en un List<T> (o una matriz, u otra estructura) y luego realizar la llamada a la implementación subyacente de SaveChanges.

Cuando se completa la llamada, debido a que sus entidades son tipos de referencia (las mejores prácticas indican que deben ser como son mutables), las claves principales de esos elementos en la lista deben rellenarse, en cuyo punto puede pasar la lista de entidades modificadas a su capa de auditoría.

Además, parece que está tratando de agregar una entidad a ese tipo de entidad y agregarla a otra colección de tipos de entidad (lo que expone ChangeLogs); Yo recomendaría contra esto. Si está ingresando elementos en otro conjunto de entidades, haga no reutilice esas entidades, pero copie las instancias al tipo de entidad apropiado.

+0

Intenté algo así (obtener una lista de entradas), pero me encontré con problemas para acceder a ellos de nuevo, ya que se separaron después de guardar. – Richard

+0

Solo las entidades eliminadas se separarán después de guardarlas. Si simplemente realiza un seguimiento de las entidades adicionales, que son las que necesita las claves, debería estar bien. –

+0

@Richard No recomendaría usar las mismas instancias de entidad para la auditoría (ya que tiene sus propios tipos de entidad) que las que acabamos de actualizar. He actualizado mi respuesta para reflejar eso. – casperOne

0

Utilice los GUID para la clave principal para que su ID pueda generarse sin tocar la base de datos.

Cuestiones relacionadas