AsNoTrackingWithIdentityResolution() in Entity Framework Core 5.0 ab Preview 7

Der Dotnet-Doktor  –  0 Kommentare

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.