Afficher les valeurs d'origine Entity Framework 7

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

Question

J'ai une table d'audit qui suit les ajouts, les suppressions et les modifications. Je surveille cela dans Entity Framework au lieu d'utiliser un déclencheur de base de données pour plusieurs raisons, mais vraiment parce que nous utilisons un compte de processus et que je souhaite suivre l'utilisateur qui a physiquement apporté cette modification à l'enregistrement.

Je travaillais avec EF 5 et je ne me souviens pas d’avoir pu le faire aussi avec EF6. Quoi qu’il en soit, avec EF 7, j’ai le plus de difficulté à saisir les valeurs d’origine.

J'ai remarqué que lorsque je suis dans la montre - je peux voir les valeurs originales à l'intérieur des membres non publics - donc dans ma tête, je sais que cela doit exister quelque part.

En fin de compte, cela fonctionne dans les versions antérieures d'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'erreur que je reçois est que EntityEntry ne contient pas de définition pour OriginalValues. Je vais m'arracher les cheveux ... Comment puis-je obtenir les valeurs d'origine d'un objet modifié avec EF 7?

Réponse acceptée

// 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}");
}

Réponse populaire

Une autre option consiste à utiliser OriginalValues , mais au lieu de PropertyNames , utilisez Properties . Cela créera les types de processus de boucle foreach de Microsoft.EntityFrameworkCore.Metadata.IProperty . La méthode GetValues a une surcharge qui accepte IProperty . Par conséquent, aucune modification de code n'est requise pour ces appels, mais vous devrez modifier l'affectation ColumnName de propertyName à property . Nom

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



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi