Partager via


Détection automatique des modifications

Lorsque vous utilisez la plupart des entités POCO, l’action permettant de déterminer le caractère d’une modification d’entité (et ainsi les mises à jour qui doivent être envoyées à la base de données) est gérée par l’algorithme Detect Changes. Detect Changes fonctionne en détectant les différences entre les valeurs de propriété actuelles de l’entité et les valeurs de propriété d’origine stockées dans une capture instantanée lorsque l’entité a été interrogée ou attachée. Les techniques présentées dans cette rubrique s’appliquent également aux modèles créés avec Code First et EF Designer.

Par défaut, Entity Framework exécute automatiquement Detect Changes lorsque les méthodes suivantes sont appelées :

  • DbSet.Find
  • DbSet.Local
  • DbSet.Add
  • DbSet.AddRange
  • DbSet.Remove
  • DbSet.RemoveRange
  • DbSet.Attach
  • DbContext.SaveChanges
  • DbContext.GetValidationErrors
  • DbContext.Entry
  • DbChangeTracker.Entries

Désactiver la détection automatique des modifications

Si vous suivez un grand nombre d’entités dans votre contexte et que vous appelez l’une de ces méthodes plusieurs fois dans une boucle, vous pouvez obtenir des améliorations significatives des performances en désactivant la détection des modifications pendant la durée de la boucle. Par exemple :

using (var context = new BloggingContext())
{
    try
    {
        context.Configuration.AutoDetectChangesEnabled = false;

        // Make many calls in a loop
        foreach (var blog in aLotOfBlogs)
        {
            context.Blogs.Add(blog);
        }
    }
    finally
    {
        context.Configuration.AutoDetectChangesEnabled = true;
    }
}

N’oubliez pas de réactiver la détection des modifications après la boucle. Nous avons utilisé une méthode try/finally pour assurer qu’elle est toujours réactivée, même si le code de la boucle lève une exception.

Une alternative à la désactivation et à la réactivation consiste à toujours conserver la détection automatique des modifications et d’appeler explicitement context.ChangeTracker.DetectChanges ou d’utiliser de façon assidue les proxies de suivi des modifications. Ces deux options sont sophistiquées et peuvent facilement introduire des bogues subtils dans votre application. Utilisez-les donc avec précaution.

Si vous devez ajouter ou supprimer de nombreux objets d’un contexte, envisagez d’utiliser DbSet.AddRange et DbSet.RemoveRange. Ces méthodes détectent automatiquement les modifications uniquement une fois les opérations d’ajout ou de suppression terminées.