EntityFramework Change Tracking no rastrea cambios

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

Pregunta

Estoy utilizando Entity Framework 7 y necesito poder hacer un seguimiento de los cambios. En última instancia, estoy haciendo algo como esto durante los cambios en SaveChanges. Lo estoy anulando luego al final usando base.SaveChanges ():

foreach (var ent in this.ChangeTracker.Entries().Where(p => p.State == EntityState.Deleted || p.State == EntityState.Modified).ToList())
{
    // For each changed record, get the audit record entries and add them
    foreach (TableChange x in GetTableChangeRecordsForChange(ent, _ChangeUser))
    {
        this.TableChanges.Add(x);
        val = true;
    }
}

En última instancia, esto llama a obtener registros de cambio de tabla:

private IEnumerable<TableChange> GetTableChangeRecordsForChange(EntityEntry dbEntry, string userId)
{
    List<TableChange> result = new List<TableChange>();    
    foreach (var ent in this.ChangeTracker.Entries().Where(p => p.State == EntityState.Deleted || p.State == EntityState.Modified).ToList())
    {
        // For each changed record, get the audit record entries and add them
        foreach (TableChange x in GetTableChangeRecordsForChange(ent, _ChangeUser))
        {
            this.TableChanges.Add(x);
            val = true;
        }
    }

    if (dbEntry.State == EntityState.Modified)
    {
        foreach (var property in dbEntry.Entity.GetType().GetTypeInfo().DeclaredProperties)
        {

            // For updates, we only want to capture the columns that actually changed
            if (!object.Equals(dbEntry.Property(property.Name).OriginalValue, dbEntry.Property(property.Name).CurrentValue))
            {
                 result.Add(new TableChange()
                 {
                       Action = "U",
                       ColumnName = property.Name,
                       CreatedBy = userId,
                       CreatedOn = DateTime.Now,
                       OldValue = dbEntry.Property(property.Name).OriginalValue.ToString(),
                       NewValue = dbEntry.Property(property.Name).CurrentValue.ToString(),
                       TableName = dbEntry.Entity.GetType().GetTypeInfo().Name,
                       TableID = dbEntry.Property("ID").CurrentValue.ToString()
                       });
              }

          }
    }
}

Ahora, el problema que estoy enfrentando es tanto OriginalValue como CurrentValue y el nuevo valor que se ingresó. No está siguiendo cuál era el valor original.

Yo tengo:

this.ChangeTracker.AutoDetectChangesEnabled = true;

Sin embargo, todavía no lo consigo para proporcionarme el valor original y actual correctamente. Cualquier ayuda es muy apreciada.

Respuesta aceptada

Así que resolví mi propio problema ... el problema al que me enfrentaba era que estaba adjuntando el registro que necesitaba actualización. Finalmente, actualicé el registro creando mi función de actualización:

public T ADMSUpdate<T>(T entity, T originalEntity)
    {
        object propertyValue = null;
        PropertyInfo[] properties = originalEntity.GetType().GetProperties();
        foreach (PropertyInfo property in properties)
        {
            propertyValue = null;
            if (null != property.GetSetMethod())
            {
                PropertyInfo entityProperty = entity.GetType().GetProperty(property.Name);
                propertyValue = entity.GetType().GetProperty(property.Name).GetValue(entity, null);

                if (null != propertyValue)
                {
                    property.SetValue(originalEntity, propertyValue, null);
                }
            }
        }
        return entity;
    }


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é