Mostra valori originali Entity Framework 7

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

Domanda

Ho una tabella di controllo che tiene traccia di Aggiunto, Eliminato e Modificato. Traccio questo all'interno di Entity Framework invece di utilizzare un trigger di database per più motivi, ma in realtà perché utilizziamo un account di elaborazione e voglio tenere traccia di ciò che l'utente ha apportato fisicamente al cambiamento.

Ho avuto questo lavoro con EF 5 e non mi ricordo che avrei potuto farlo funzionare anche in EF6. In entrambi i casi sto avendo il momento più difficile con EF 7 cercando di catturare i valori originali.

Ho notato che quando sono nell'orologio, riesco a vedere i valori originali all'interno dei membri non pubblici, quindi nella mia testa so che deve esistere da qualche parte.

In definitiva questo funziona all'interno delle versioni precedenti di EF:

EntityEntry dbEntry; //this is actually passed in a different area just showing as an example.

foreach (string propertyName in dbEntry.OriginalValues.PropertyNames)
{
    // For updates, we only want to capture the columns that actually changed
    if (!object.Equals(dbEntry.OriginalValues.GetValue<object>(propertyName), dbEntry.CurrentValues.GetValue<object>(propertyName)))
    {
        result.Add(new TableChange()
        {
            AuditLogID = Guid.NewGuid(),
            UserID = userId,
            EventDateUTC = changeTime,
            EventType = "M",    // Modified
            TableName = tableName,
            RecordID = dbEntry.OriginalValues.GetValue<object>(keyName).ToString(),
            ColumnName = propertyName,
            OriginalValue = dbEntry.OriginalValues.GetValue<object>(propertyName) == null ? null : dbEntry.OriginalValues.GetValue<object>(propertyName).ToString(),
            NewValue = dbEntry.CurrentValues.GetValue<object>(propertyName) == null ? null : dbEntry.CurrentValues.GetValue<object>(propertyName).ToString()
         }
         );
      }
 }

L'errore che sto ottenendo è che EntityEntry non contiene una defition per OriginalValues. Sto per tirarmi fuori i capelli ... Come ottengo i valori originali da un oggetto modificato con EF 7?

Risposta accettata

// using System.Reflection;
foreach (var property in dbEntry.Entity.GetType().GetTypeInfo().DeclaredProperties)
{
    var originalValue = dbEntry.Property(property.Name).OriginalValue;
    var currentValue = dbEntry.Property(property.Name).CurrentValue;
    Console.WriteLine($"{property.Name}: Original: {originalValue}, Current: {currentValue}");
}

Risposta popolare

Un'altra opzione è usare ancora OriginalValues , ma invece di PropertyNames , usa Proprietà . Ciò renderà i tipi di processo del ciclo foreach di Microsoft.EntityFrameworkCore.Metadata.IProperty . Il metodo GetValues ha un sovraccarico che accetta IProperty , quindi non sono necessarie modifiche nel codice per tali chiamate, ma sarà necessario modificare l'assegnazione ColumnName da propertyName a property . Nome

foreach (var property in entityEntry.OriginalValues.Properties)
{
    if (!object.Equals(entityEntry.OriginalValues.GetValue<object>(property), 
        entityEntry.CurrentValues.GetValue<object>(property)))
    {
        result.Add(
            new AuditLog()
            {
                UserId = userId,
                EventDate = changeTime,
                EventType = "M",
                TableName = tableName,
                RecordId = entityEntry.OriginalValues.GetValue<object>(keyName).ToString(),
                ColumnName = property.Name,
                OriginalValue =
                    entityEntry.OriginalValues.GetValue<object>(property) == null
                    ? null
                    : entityEntry.OriginalValues.GetValue<object>(property).ToString(),
                NewValue = 
                    entityEntry.CurrentValues.GetValue<object>(property) == null
                    ? null
                    : entityEntry.CurrentValues.GetValue<object>(property).ToString()
        });
    }
}



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é