Nachverfolgen von Visual Studio. No-ÜberwachungsabfragenTracking vs. No-Tracking Queries

Nachverfolgen von gesteuert, und zwar unabhängig davon, ob Entity Framework Core Informationen zu einer Entitätsinstanz in seiner System zur änderungsnachverfolgung beibehalten werden sollen.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 Änderungen erkannt, die in der Entität an die Datenbank während der beibehalten werden SaveChanges().If an entity is tracked, any changes detected in the entity will be persisted to the database during SaveChanges(). Entity Framework Core wird auch Fixup-Navigationseigenschaften zwischen Entitäten, die aus einer Überwachungsabfrage abgerufen werden und Entitäten, die zuvor in der 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

Sie können anzeigen, dass dieser Artikel Beispiel auf GitHub.You can view this article's sample on GitHub.

Abfragen zur änderungsnachverfolgungTracking queries

Standardmäßig werden Abfragen, die Entitätstypen zurückgeben nachverfolgen.By default, queries that return entity types are tracking. Dies bedeutet, Sie können Änderungen vornehmen, um die Instanzen der Entität und wurden diese Änderungen persistent gespeichert, vom SaveChanges().This means you can make changes to those entity instances and have those changes persisted by SaveChanges().

Im folgenden Beispiel die Änderung auf die Bewertung der Blogs erkannt und in der Datenbank während der beibehaltenen 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();
}

No-ÜberwachungsabfragenNo-tracking queries

Keine Überwachungsabfragen sind nützlich, wenn die Ergebnisse in einem Szenario ohne Schreibzugriff verwendet werden.No tracking queries are useful when the results are used in a read-only scenario. Sie sind schneller ausgeführt werden, da besteht keine Notwendigkeit für Setup änderungsnachverfolgungsinformationen.They are quicker to execute because there is no need to setup change tracking information.

Sie können eine einzelne Abfrage auf ohne-Überwachung werden austauschen:You can swap an individual query to be no-tracking:

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

Sie können auch die standardüberwachung Verhalten auf Instanzebene Kontext ä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

Keine Überwachungsabfragen ausführen weiterhin identitätsauflösung innerhalb der Abfrage angefordert.No tracking queries still perform identity resolution within the excuting query. Wenn das Resultset auf die gleiche Entität mehrmals enthält, wird dieselbe Instanz der Entitätsklasse für jedes Vorkommen im Resultset 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. Schwache Verweise werden jedoch verwendet, zum Nachverfolgen Entitäten, die bereits zurückgegeben wurden.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ültigkeitsbereich verlässt, und die Garbagecollection ausführt, 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 der Abfrage.For more information, see How Query Works.

Nachverfolgen und für ProjektionenTracking and projections

Auch wenn der Ergebnistyp der Abfrage ein Entitätstyp ist, wenn das Ergebnis Entitätstypen enthält werden sie trotzdem standardmäßig nachverfolgt werden.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, womit einen anonymen Typ und die Instanzen von Blog im Ergebnis Satz nachverfolgt werden.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 das Resultset keine Entitätstypen enthält, wird keine Überwachung ausgeführt.If the result set does not contain any entity types, then no tracking is performed. In der folgenden Abfrage, womit einen anonymen Typ mit einigen der Werte aus der Entität (jedoch keine Instanzen von den tatsächlichen Entitätstyp), besteht keine Überwachung 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
            });
}