Registro de auditoría de Entity Framework 7

asp.net-core audit c# entity-framework-core

Pregunta

Estoy transfiriendo un proyecto antiguo a ASP.NET 5 y Entity Framework 7. He utilizado el primer enfoque de la base de datos (andamio DNX) para crear el modelo.

El proyecto anterior se basa en Entity Framework 4 y el seguimiento de auditoría se implementa anulando el método SaveChanges de DbContext :

public override int SaveChanges(System.Data.Objects.SaveOptions options)
{
    int? UserId = null;
    if (System.Web.HttpContext.Current != null) 
        UserId = (from user in Users.Where(u => u.UserName == System.Web.HttpContext.Current.User.Identity.Name) select user.Id).SingleOrDefault();

    foreach (ObjectStateEntry entry in ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified))
    {
        Type EntityType = entry.Entity.GetType();

        PropertyInfo pCreated = EntityType.GetProperty("Created");
        PropertyInfo pCreatedById = EntityType.GetProperty("CreatedById");
        PropertyInfo pModified = EntityType.GetProperty("Modified");
        PropertyInfo pModifiedById = EntityType.GetProperty("ModifiedById");

        if (entry.State == EntityState.Added)
        {
            if (pCreated != null)
                pCreated.SetValue(entry.Entity, DateTime.Now, new object[0]);
            if (pCreatedById != null && UserId != null)
                pCreatedById.SetValue(entry.Entity, UserId, new object[0]);
        }
        if (pModified != null)
            pModified.SetValue(entry.Entity, DateTime.Now, new object[0]);
        if (pModifiedById != null && UserId != null)
            pModifiedById.SetValue(entry.Entity, UserId, new object[0]);
        }
    }

    return base.SaveChanges(options);
}

Mi pregunta es, ¿cómo puedo implementar esto en Entity Framework 7? ¿Tengo que tomar el primer acercamiento al código?

Respuesta popular

Básicamente tienes dos formas de lograr esto:

Usando la API ChangeTracker (EF 6+):

Esta es la forma en que lo hacemos actualmente en EF 6 y aún es válido y funciona para EF 7:

Primero debe asegurarse de que sus entidades estén implementando una interfaz común para los campos de auditoría:

public interface IAuditableEntity 
{
    int? CreatedById { get; set; }

    DateTime Created { get; set; }

    int? ModifiedById { get; set; }

    DateTime Modified { get; set; }
}


Luego, puede anular SaveChanges y actualizar cada campo común con valores de auditoría:

public interface IAuditableEntity 
{
    int? CreatedById { get; set; }

    DateTime Created { get; set; }

    int? ModifiedById { get; set; }

    DateTime Modified { get; set; }
}


Usando la nueva característica de "Propiedades de la sombra" de EF 7:

Las propiedades de sombra son propiedades que no existen en su clase de entidad. El valor y el estado de estas propiedades se mantienen únicamente en el Rastreador de cambios.

En otras palabras, las columnas de auditoría no estarán expuestas en sus entidades, lo que parece ser una mejor opción en comparación con la anterior donde tiene que incluirlas en sus entidades.

Para implementar propiedades de sombra, primero debe configurarlas en sus entidades. Digamos, por ejemplo, que tiene un objeto Usuario que necesita tener algunas columnas de auditoría:

public interface IAuditableEntity 
{
    int? CreatedById { get; set; }

    DateTime Created { get; set; }

    int? ModifiedById { get; set; }

    DateTime Modified { get; set; }
}


Una vez configurado, ahora puede acceder a ellos en SaveChanges () anular y actualizar sus valores en consecuencia:

public interface IAuditableEntity 
{
    int? CreatedById { get; set; }

    DateTime Created { get; set; }

    int? ModifiedById { get; set; }

    DateTime Modified { get; set; }
}


Pensamientos finales:

Para implementar algo así como columnas de auditoría, tomaré el enfoque de las Propiedades de la Sombra ya que estas son preocupaciones transversales y no necesariamente pertenecen a los objetos de mi dominio, por lo que tenerlos implementados de esta manera mantendrá los objetos de mi dominio limpios y ordenados.




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué