Neu in .NET 6 [20]: Kompilierte Modelle in Entity Framework Core

Der Dotnet-Doktor Holger Schwichtenberg  –  0 Kommentare

In Entity Framework Core 6.0 kann man nun die Mapping-Modelle zur Entwicklungszeit für einen beschleunigen Anwendungsstart vorkompilieren.

Die sich durch die Codegenerierung bei der ersten Verwendung des Entity Framework-Kontext ergebende verlängerte Kaltstartzeit einer .NET-Anwendung ist seit den Anfängen von Microsofts Objekt-Relationalem Mapper ein Thema .

Im klassisches Entity Framework gab es zur Beschleunigung des Kaltstarts die sogenannte View Generation. Für das moderne Entity Framework Core gab es bisher keinen vergleichbaren Optimierungsmechanismus. Das hat Microsoft erst jetzt mit Entity Framework Core 6.0 geändert. Das Pendant zur View Generation heißt Compiled Model.

Das kompilierte Modell erzeugen Entwickler innerhalb von Visual Studio in der NuGet Package Manager Console mit dem PowerShell-Befehl Optimize-DbContext.

Außerhalb von Visual Studio kann man die .NET-Kommandozeilenschnittstelle verwenden:

dotnet ef dbcontext optimize  

In beiden Fällen gibt es optionale Parameter für den Kontextnamen, den Namensraum und den Ordner.

Durch die Modellkompilierung entsteht im Projekt eine Klasse ContextModel.cs, eine Klasse ContextModelBuilder.cs sowie jeweils eine Klasse AbcEntityType.cs pro Entitätsklasse. Diese Klassen werden mitkompiliert.

Zunächst gilt es aber, das vorkompilierte Modell in der Kontextklasse mit dem Aufruf der Methode UseModel() zu aktivieren:

protected override void OnConfiguring(DbContextOptionsBuilder builder)
{
if (builder.IsConfigured) return;
builder.EnableSensitiveDataLogging(true);
builder.UseSqlServer(@"Server=ServerName;Database=DBName;" +
"Trusted_Connection=True;" +
"MultipleActiveResultSets=True;").
UseModel(ContextModel.Instance);
}

Das steigert die Kaltstartgeschwindigkeit des Entity Framework Core-Kontextes. Insbesondere merkt man dies bei größeren und komplexeren Objektmodellen.

Aber Achtung: Die Codegenerierung für das Compiled Model muss nach jeder Änderung am Modell immer wieder neu angeworfen werden! Außerdem sind einige Funktionen von Entity Framework Core wie globale Query Filter, Change Tracking Proxies und Lazy Loading nicht in Verbindung mit Compiled Models verfügbar.