Über 80 Neuerungen in Entity Framework Core 5.0
Die am 10. November erschienene Version des OR-Mappers enthält zahlreiche Neuerungen.
- Dr. Holger Schwichtenberg
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
undSystem.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 mitHasFillFactor()
, persistente berechnete Spalten mitstored = true in HasComputedColumnSql()
sowieUseCollation()
als Einstellung für Sortierungen und Vergleiche. Neu ist auch, dass Tabellen mitExcludeFromMigrations()
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()
undUseQuerySplittingBehavior()
- Weitere skalare Datenbankfunktionen
- Einfache Anzeige des zu einer LINQ-Abfrage gehörenden SQL-Befehls mit
ToQueryString()
undCreateDbCommand()
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()
undAddPooledDbContextFactory()
. - 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()
undSaveChangesFailed()
. Einfluss auf den Speichervorgang können Entwickler in einemSaveChangesInterceptor
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.