Abfragen mit Nachverfolgung im Vergleich zu Abfragen ohne NachverfolgungTracking vs. No-Tracking Queries

Das Nachverfolgungsverhalten steuert, ob Entity Framework Core Informationen über eine Entitätsinstanz in der Änderungsprotokollierung speichert.Tracking behavior controls whether or not Entity Framework Core will keep information about an entity instance in its change tracker. Wenn eine Entität nachverfolgt wird, werden alle Änderungen, die in der Entität erkannt werden, während SaveChanges() in der Datenbank beibehalten.If an entity is tracked, any changes detected in the entity will be persisted to the database during SaveChanges(). Entity Framework Core korrigiert zusätzlich Navigationseigenschaften zwischen Entitäten, die von einer Abfrage mit Nachverfolgung abgerufen werden, und Entitäten, die zuvor in die DbContext-Instanz geladen wurden.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.

Tipp

Das in diesem Artikel verwendete Beispiel finden Sie auf GitHub.You can view this article's sample on GitHub.

Abfragen mit NachverfolgungTracking queries

Abfragen, die Entitätstypen zurückgeben, verfügen standardmäßig über Nachverfolgung.By default, queries that return entity types are tracking. Das bedeutet, Sie können Änderungen an diesen Entitätsinstanzen vornehmen, und diese Änderungen werden von SaveChanges() beibehalten.This means you can make changes to those entity instances and have those changes persisted by SaveChanges().

Im folgenden Beispiel wird die Änderung an der Bewertung des Blogs erkannt und während SaveChanges() in der Datenbank beibehalten.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();
}

Abfragen ohne NachverfolgungNo-tracking queries

Abfragen ohne Nachverfolgung sind nützlich, wenn die Ergebnisse in einem schreibgeschützten Szenario verwendet werden.No tracking queries are useful when the results are used in a read-only scenario. Sie werden schneller ausgeführt, da keine Informationen für die Änderungsnachverfolgung eingerichtet werden müssen.They are quicker to execute because there is no need to setup change tracking information.

Sie können eine einzelne Abfrage ändern, sodass sie keine Nachverfolgung ausführt:You can swap an individual query to be no-tracking:

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

Sie können das Standardnachverfolgungsverhalten auch auf der Ebene der Kontextinstanz ändern: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();
}

Hinweis

Abfragen ohne Nachverfolgung führen weiterhin die Identitätsauflösung in der ausführenden Abfrage aus.No tracking queries still perform identity resolution within the excuting query. Wenn die Ergebnisse mehrmals dieselbe Entität enthalten, wird die gleiche Instanz der Entitätsklasse für jedes Vorkommen in den Ergebnissen zurückgegeben.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. Allerdings werden schwache Verweise verwendet, um bereits zurückgegebene Entitäten nachzuverfolgen.However, weak references are used to keep track of entities that have already been returned. Wenn ein vorheriges Ergebnis mit derselben Identität den gültigen Bereich verlässt und die Garbage Collection ausgeführt wird, können Sie eine neue Entitätsinstanz abrufen.If a previous result with the same identity goes out of scope, and garbage collection runs, you may get a new entity instance. Weitere Informationen finden Sie unter Funktionsweise von Abfragen.For more information, see How Query Works.

Nachverfolgung und ProjektionenTracking and projections

Selbst wenn der Ergebnistyp der Abfrage kein Entitätstyp ist, wird die Nachverfolgung standardmäßig ausgeführt, sofern das Ergebnis Entitätstypen enthält.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. In der folgenden Abfrage, die einen anonymen Typ zurückgibt, werden die Instanzen von Blog im Ergebnis nachverfolgt.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()
            });
}

Wenn die Ergebnisse keine Entitätstypen enthalten, wird keine Nachverfolgung ausgeführt.If the result set does not contain any entity types, then no tracking is performed. In der folgenden Abfrage, die einen anonymen Typ mit einigen Werten der Entität zurückgibt (aber keine Instanzen des aktuellen Entitätstyps), wird keine Nachverfolgung ausgeführt.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
            });
}