Über 80 Neuerungen in Entity Framework Core 5.0

Der Dotnet-Doktor Holger Schwichtenberg  –  3 Kommentare

Die am 10. November erschienene Version des OR-Mappers enthält zahlreiche Neuerungen.

Das nun auf NuGet.org veröffentlichte Entity Framework Core 5.0 ist der Nachfolger von Entity Framework Core 3.1, das im Dezember 2019 erschienen ist. Die Version 4.0 wurde ausgelassen in Angleichung an .NET 5.0. Anders als .NET Core 3.1 (Vorgänger von .NET 5.0) hat Entity Framework Core das "Core" im Namen nicht verloren, um sich weiterhin klar vom klassischen Entity Framework (Aktuelle Version 6.4) abzugrenzen.

Nicht für klassisches .NET Framework

Entity Framework Core 5.0 läuft nicht nur auf .NET 5.0, sondern auf allen Plattformen, die .NET Standard 2.1 anbieten (also z.B. .NET Core 3.1 und aktuelle Xamarin-Versionen). Das klassisches .NET Framework ist damit aber ausgeschlossen, da es auch in der aktuellsten Version 4.8 nur .NET Standard 2.0 realisiert.

Dies bedeutet, dass Entwickler, die bisher Entity Framework Core 1.0 bis 3.1 auf dem klassischen .NET Framework verwendet haben, nun in einer Sackgasse stehen. Support für Entity Framework Core 3.1 gibt es wie für .NET Core 3.1 nur noch bis zum 3. Dezember 2022.

betterCode() präsentiert: .NET 5.0 – Das Online-Event am 3. Dezember 2020

Das können Sie lernen:

  • Von .NET Framework über .NET Core zu .NET 5.0: Was bedeutet das für die Migration, und wie groß sind die Aufwände?
  • Was ist neu in .NET 5.0?
  • Neue Features: ASP.NET Core 5.0 und Blazor 5.0 kennen lernen
  • Die wichtigsten Sprachneuerungen in C# 9
  • Mobile Entwicklung mit .NET 5
  • OR-Mapping mit Entity Framework Core 5.0
  • WinUI 3 als Alternative zu WPF und UWP
  • Ausblick auf .NET 6.0

Viele neue Funktionen

Entity Framework Core 5.0 bietet über 80 Neuerungen (vgl. 15-teilige Tweet-Folge von Arthur Vickers). Etwas zusammengefasst ergeben sich folgende wesentliche Verbesserungen:

  • Abstraktion von N:M-Beziehungen (keine explizite .NET-Klasse für Zwischentabellen mehr notwendig)
  • Table-per-Type-Mapping (TPT) als Alternative zu Table-per-Hierarchy (TPH)
  • Mapping der .NET-Datentypen System.Net.IPAddress und System.Net.NetworkInformation.PhysicalAddress auf Zeichenkettenspalten
  • Erweiterung der Fluent-API, zum Beispiel Genauigkeit für Dezimalzahlen mit HasPrecision() und Füllfaktor für SQL-Server-Indizes mit HasFillFactor(), persistente berechnete Spalten mit stored = true in HasComputedColumnSql() sowie UseCollation() als Einstellung für Sortierungen und Vergleiche. Neu ist auch, dass Tabellen mit ExcludeFromMigrations() aus den Schemamigrationen ausgeschlossen werden können.
  • Neue Annotation [Keyless], [Index] und [BackingField] als Alternative zur Fluent-API
  • Erweiterungen bei den Kommandozeilenbefehlen
  • Eager Loading mit Filter (Filtered Include)
  • Aufspalten der Abfragen beim Eager Loading mit .AsSplitQuery() und UseQuerySplittingBehavior()
  • Weitere skalare Datenbankfunktionen
  • Einfache Anzeige des zu einer LINQ-Abfrage gehörenden SQL-Befehls mit ToQueryString() und CreateDbCommand() sowie im Visual Studio Debugger per Debugger View
  • Vereinfachte Konfiguration der SQL-Protokollierung mit LogTo()
  • Detaillierte Fehlermeldungen mit EnableDetailedErrors()
  • Doppelte Objekte eliminieren bei No-Tracking-Queries mit PerformIdentityResolution() bzw. AsNoTrackingWithIdentityResolution()
  • Mit ChangeTracker.Clear() können Entwickler den Zustand eines Kontexts zurücksetzen.
  • Für die Beschaffung von Kontextinstanzen gibt es die neuen Methoden AddDbContextFactory() und AddPooledDbContextFactory().
  • Bei Transaktionen werden nun Savepoints und Transaction-IDs unterstützt.
  • Es ist erstmals möglich, dass der OR-Mapper bei einer einzigen Entitätsklasse für das Lesen der Daten eine Datenbanksicht (View), aber für das Schreiben eine Tabelle nutzt.
  • Table-Valued-Functions lassen sich jetzt nicht nur mit FromSql() aufrufen, Entwickler können auch auf einfache Weise Wrapper-Methoden in der Kontextklasse bereitstellen.
  • Microsoft hat Ereignisse ergänzt, die beim Speichern ausgelöst werden: SavingChanges(), SavedChanges() und SaveChangesFailed(). Einfluss auf den Speichervorgang können Entwickler in einem SaveChangesInterceptor nehmen.
  • Softwareentwickler können mit Indexer Properties auf Basis von C#-Indexern bestehende Entitätstypen um Spalten erweitern und auch zur Laufzeit ganz neue dynamische Entitätstypen mit Datenbankabbildung erschaffen.
  • Zur Diagnose können Betreiber einer Anwendung nun Event Counter des OR-Mappers mit dotnet counters monitor abrufen.