web-dev-qa-db-fra.com

Fonctionnement du suivi des modifications dans Entity Framework

Étant donné le code suivant, comment EF/DbContext connaît-il la modification apportée à l'objet client:

class Program
{
    static void Main()
    {
        using(var shopContext = new ShopContext())
        {
            var customer = shopContext.Customers.Find(7);

            customer.City = "Marion";

            customer.State = "Indiana";

            shopContext.SaveChanges();
        }
    }
}

public class ShopContext : DbContext
{
    public DbSet<Customer> Customers { get; set; }
}

public class Customer
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string City { get; set; }
    public string State { get; set; }
}

Je vous remercie

40
Yair Nevet

Lorsque vous chargez l'entité à partir du contexte, elle conserve une structure de données supplémentaire - appelons-la entrée. L'entrée contient deux ensembles de valeurs - les valeurs d'origine et les valeurs actuelles. Lorsque vous exécutez l'opération SaveChanges EF passe par vos entités client et met à jour les valeurs actuelles dans l'entrée afin qu'elles correspondent à l'état réel de votre entité - cette opération est appelée détection changements . Pendant la génération de commandes SQL, EF comparera les valeurs actuelles et originales et construira une instruction de mise à jour SQL pour modifier les valeurs modifiées dans la base de données. Cette opération est appelée suivi du changement de cliché - EF conserve un cliché dans l'entrée.

Il existe une alternative appelée suivi dynamique des changements qui modifiera la valeur actuelle dans l'entrée en même temps que vous affectez la valeur à la propriété de votre entité. Le suivi des modifications dynamiques a des exigences spécifiques (comme toutes vos propriétés dans l'entité doivent être virtual) car il doit envelopper votre classe dans un proxy dynamique lors de l'exécution. Auparavant, c'était la méthode préférée, mais en raison de certains problèmes de performances dans des scénarios complexes, le suivi des modifications des instantanés est actuellement censé être utilisé par défaut.

54
Ladislav Mrnka