Obtenir toutes les modifications apportées à un objet dans Entity Framework

c# entity-framework

Question

Existe-t-il un moyen d'obtenir toutes les modifications apportées à un objet dans Entity Framework avant qu'il n'enregistre toutes les modifications? La raison en est que je veux créer une table de journal dans la base de données de nos clients:

alors...

Existe-t-il un moyen d'obtenir les valeurs actuelles de la base de données (anciennes) et les nouvelles valeurs (actuelles) avant l'enregistrement des modifications?

Si ce n'est pas le cas, comment puis-je y parvenir de manière générique afin que tous mes modèles de vue puissent en hériter? (J'utilise la structure MVVM + M)

Réponse acceptée

Vous pouvez utiliser ObjectStateManager , GetObjectStateEntry d' ObjectContext pour obtenir un ObjectStateEntry d' un objet, qui contient ses valeurs d'origine et actuelles dans les propriétés OriginalValues et CurrentValues . Vous pouvez obtenir le nom des propriétés modifiées en utilisant la méthode GetModifiedProperties .

Vous pouvez écrire quelque chose comme:

var myObjectState=myContext.ObjectStateManager.GetObjectStateEntry(myObject);
var modifiedProperties=myObjectState.GetModifiedProperties();
foreach(var propName in modifiedProperties)
{
    Console.WriteLine("Property {0} changed from {1} to {2}", 
         propName,
         myObjectState.OriginalValues[propName],
         myObjectState.CurrentValues[propName]);
}

Réponse populaire

À partir de EF5, vous pouvez enregistrer vos modifications dans la méthode SaveChanges () de la manière suivante:

    public override int SaveChanges()
    {

        var changes = from e in this.ChangeTracker.Entries()
                      where e.State != System.Data.EntityState.Unchanged
                      select e;

        foreach (var change in changes)
        {
            if (change.State == System.Data.EntityState.Added)
            {
                // Log Added
            }
            else if (change.State == System.Data.EntityState.Modified)
            {
                // Log Modified
                var item = change.Cast<IEntity>().Entity;
                var originalValues = this.Entry(item).OriginalValues;
                var currentValues = this.Entry(item).CurrentValues;

                foreach (string propertyName in originalValues.PropertyNames)
                {
                    var original = originalValues[propertyName];
                    var current = currentValues[propertyName];

                    if (!Equals(original, current))
                    {
                        // log propertyName: original --> current
                    }
                }

            }
            else if (change.State ==  System.Data.EntityState.Deleted)
            {
                // log deleted
            }
        }
        // don't forget to save
        base.SaveChanges();
    }


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow