AsNoTrackingWithIdentityResolution() in Entity Framework Core 5.0 ab Preview 7
Microsoft hat den Namen für die forcierte Identitätsfeststellung beim Laden im "No-Tracking"-Modus geändert.
- Dr. Holger Schwichtenberg
Microsoft hat den Namen für die forcierte Identitätsfeststellung beim Laden im "No-Tracking"-Modus geändert.
Gestern hatte ich schon in einem Nachrichtenbeitrag auf einige Neuerungen in der Preview 7 von Entity Framework Core hingewiesen. Hier fällt außer dem im der News erwähnten Inhalten auf, dass AsNoTrackingWithIdentityResolution()
die Abfrage AsNoTracking().PerformIdentityResolution()
ersetzt.
Der No-Tracking-Modus macht – seit Entity Framework Core 3.0 und anders als der Tracking-Modus – keine Identitätsfeststellung bereits geladener Objekte. Das heißt, er legt für ein und denselben Datensatz mehrere Objekte mit gleichem Inhalt an, wenn auf den Datensatz mehrfach verwiesen wird.
Ein Beispiel
Wenn es viele FlĂĽge gibt, aber nur wenige Piloten, die diese FlĂĽge fliegen, dann werden im Tracking-Modus nach dieser LINQ-Abfrage
var flightSet = ctx.FlightSet.AsTracking().Include(x => x.Pilot).ToList();
alle FlĂĽge, die den gleichen Piloten haben, auf ein und das gleiche Pilot-Objekt verweisen.
Aber nach dieser LINQ-Abfrage
var flightSet = ctx.FlightSet.AsNoTracking().Include(x => x.Pilot).ToList();
gibt es fĂĽr jeden Flug ein eigenes Pilot-Objekt im RAM, selbst wenn es nur einen Piloten-Datensatz in der Datenbank gab
In der fĂĽnften Preview von .NET 5.0 hatte Microsoft das alte Verhalten (vor Version 3.0) zurĂĽckgebracht mit:
var flightSet = ctx.FlightSet.AsNoTracking().PerformIdentityResolution().Include(x => x.Pilot).ToList();
Nun in Preview 7 muss man schreiben:
var flightSet = ctx.FlightSet.AsNoTrackingWithIdentityResolution().Include(x => x.Pilot).ToList();
Außerdem ist seit Preview 7 die Identity Resolution für alle Abfragen als Standard voreinstellbar über die Aufzählungseigenschaft QueryTrackingBehavior
in der Klasse Microsoft.EntityFrameworkCore.DbContext
im Unterobjekt ChangeTracker. Hier gab es zuvor nur die Optionen QueryTrackingBehavior.TrackAll
und QueryTrackingBehavior.NoTracking
.
()