Requêtes avec suivi ou sans suiviTracking vs. No-Tracking Queries

Le comportement suivi contrôle si Entity Framework Core conserve les informations relatives à une instance d’entité dans son traceur de modifications.Tracking behavior controls whether or not Entity Framework Core will keep information about an entity instance in its change tracker. Si une entité est suivie, toutes les modifications détectées dans l’entité sont rendues persistantes dans la base de données pendant SaveChanges().If an entity is tracked, any changes detected in the entity will be persisted to the database during SaveChanges(). Entity Framework Core corrige également les propriétés de navigation entre les entités qui sont obtenues à partir d’une requête de suivi et les entités qui ont été précédemment chargées dans l’instance de DbContext.Entity Framework Core will also fix-up navigation properties between entities that are obtained from a tracking query and entities that were previously loaded into the DbContext instance.

Conseil

Vous pouvez afficher cet exemple sur GitHub.You can view this article's sample on GitHub.

Requêtes avec suiviTracking queries

Par défaut, les requêtes qui retournent des types d’entités ont le suivi activé.By default, queries that return entity types are tracking. Cela signifie que vous pouvez apporter des modifications à ces instances d’entité et rendre ces modifications persistantes avec SaveChanges().This means you can make changes to those entity instances and have those changes persisted by SaveChanges().

Dans l’exemple suivant, la modification de l’évaluation des blogs sera détectée et rendue persistante dans la base de données pendant SaveChanges().In the following example, the change to the blogs rating will be detected and persisted to the database during SaveChanges().

using (var context = new BloggingContext())
{
    var blog = context.Blogs.SingleOrDefault(b => b.BlogId == 1);
    blog.Rating = 5;
    context.SaveChanges();
}

Pas de suivi des requêtesNo-tracking queries

Les requêtes sans suivi sont utiles lorsque les résultats sont utilisés dans un scénario en lecture seule.No tracking queries are useful when the results are used in a read-only scenario. Elles sont plus rapides à exécuter, car il est inutile de configurer les informations de suivi des modifications.They are quicker to execute because there is no need to setup change tracking information.

Vous pouvez permuter une requête individuelle pour être sans suivi :You can swap an individual query to be no-tracking:

using (var context = new BloggingContext())
{
    var blogs = context.Blogs
        .AsNoTracking()
        .ToList();
}

Vous pouvez également modifier le comportement de suivi par défaut au niveau de l’instance du contexte :You can also change the default tracking behavior at the context instance level:

using (var context = new BloggingContext())
{
    context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;

    var blogs = context.Blogs.ToList();
}

Note

Les requêtes sans suivi continuent à effectuer la résolution d’identité lors de l’exécution de la requête.No tracking queries still perform identity resolution within the excuting query. Si le jeu de résultats contient plusieurs fois à la même entité, la même instance de la classe d’entité s’affichera pour chaque occurrence du jeu de résultats.If the result set contains the same entity multiple times, the same instance of the entity class will be returned for each occurrence in the result set. Toutefois, des références faibles sont utilisées pour effectuer le suivi des entités qui ont déjà été retournées.However, weak references are used to keep track of entities that have already been returned. Si un résultat antérieur avec la même identité est hors de portée, et que le nettoyage de la mémoire s’exécute, vous risquez d’obtenir une nouvelle instance de l’entité.If a previous result with the same identity goes out of scope, and garbage collection runs, you may get a new entity instance. Pour plus d'informations, consultez la section Fonctionnement d’une requête.For more information, see How Query Works.

Suivi et projectionsTracking and projections

Même si le type de résultat de la requête n’est pas un type d’entité, si le résultat contient des types d’entité, le suivi est toujours activé par défaut.Even if the result type of the query isn't an entity type, if the result contains entity types they will still be tracked by default. Dans la requête suivante, qui retourne un type anonyme, les instances de Blog dans le jeu de résultats sont suivies.In the following query, which returns an anonymous type, the instances of Blog in the result set will be tracked.

using (var context = new BloggingContext())
{
    var blog = context.Blogs
        .Select(b =>
            new
            {
                Blog = b,
                Posts = b.Posts.Count()
            });
}

Si le jeu de résultats ne contient pas de types d’entité, aucun suivi n’est effectué.If the result set does not contain any entity types, then no tracking is performed. Dans la requête suivante, qui retourne un type anonyme avec certaines des valeurs de l’entité (mais aucune instance du type d’entité réel), aucun suivi n’est effectué.In the following query, which returns an anonymous type with some of the values from the entity (but no instances of the actual entity type), there is no tracking performed.

using (var context = new BloggingContext())
{
    var blog = context.Blogs
        .Select(b =>
            new
            {
                Id = b.BlogId,
                Url = b.Url
            });
}