EntityFramework Change Tracking non rileva le modifiche

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

Domanda

Sto utilizzando Entity Framework 7 e devo essere in grado di tenere traccia delle modifiche. In definitiva, sto facendo qualcosa di simile durante il salvataggio su SaveChanges, lo sovrascrivo poi alla fine 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;
    }
}

Questo alla fine richiede di ottenere i record delle modifiche alle tabelle:

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

          }
    }
}

Ora il problema che sto affrontando è sia OriginalValue che CurrentValue e il nuovo valore inserito. Non sta monitorando il valore originale.

Ho:

this.ChangeTracker.AutoDetectChangesEnabled = true;

Tuttavia, non riesco ancora a fornirmi il valore originale e attuale correttamente. Qualsiasi aiuto è molto apprezzato.

Risposta accettata

Così ho capito il mio problema ... il problema che stavo affrontando era che stavo allegando il record che necessitava di aggiornamento. Alla fine ho aggiornato il record creando la mia funzione di aggiornamento:

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



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché