Portieren von EF6 nach EF Core
Entity Framework Core (kurz: EF Core) ist eine für moderne Anwendungsarchitekturen umgeschriebene Version von Entity Framework. Aufgrund grundlegender Änderungen gibt es keinen direkten Upgradepfad. Diese Dokumentation soll als Leitfaden für den gesamten Portiervorgang Ihrer EF6-Anwendungen zu EF Core dienen.
Wichtig
Bevor Sie die Portierung starten, müssen Sie überprüfen, ob EF Core den Datenzugriffsanforderungen für Ihre Anwendung entspricht. In der EF Core-Dokumentation finden Sie alle wichtigen Voraussetzungen.
Wichtig
Es liegt ein bekanntes Problem (microsoft/dotnet-apiport #993) mit dem Portability Analyzer vor. Dieser gibt fälschlicherweise an, dass EF Core nicht mit .NET 5 und .NET 6 kompatibel ist. Diese Warnungen können bedenkenlos ignoriert werden, da EF Core vollständig mit den Zielframeworks .NET 5 und .NET 6 kompatibel ist.
Gründe für ein Upgrade
Neue Entwicklungsprojekte für Entity Framework finden ausschließlich in EF Core statt. Eine Abwärtsportierung neuer Features zu EF6 ist nicht geplant. EF Core wird mit den neuesten .NET-Runtimes ausgeführt und nutzt alle runtimespezifischen, plattformspezifischen (z. B. ASP.NET Core oder WPF) und sprachspezifischen Features. Hier sind einige der Vorteile eines Upgrades:
- Sie profitieren von den kontinuierlichen Leistungsverbesserungen in EF Core. Beispielsweise hat ein Kunde, der von EF6 zu EF Core 6 migriert ist, aufgrund der Abfragenaufteilung eine 40-fache Reduzierung der Auslastung bei anspruchsvollen Abfragen festgestellt. Viele Kunden berichten von enormen Leistungssteigerungen durch den Wechsel zur neuesten EF Core-Version.
- Sie können die neuen Features in EF Core nutzen. Zu EF6 werden keine weiteren Features mehr hinzugefügt. Neue Features wie der Azure Cosmos DB-Anbieter und
DbContextFactory
werden nur zu EF Core hinzugefügt. Einen vollständigen Vergleich von EF6 mit EF Core, einschließlich mehrerer exklusiver EF Core-Features, finden Sie unter Vergleichen von EF Core und EF6. - Sie können Ihren Anwendungsstapel modernisieren, indem Sie die Dependency Injection nutzen und den Datenzugriff mit Technologien wie gRPC und GraphQL integrieren.
Hinweis zu Migrationen
In dieser Dokumentation werden die Begriffe Portieren und Upgrade verwendet, um Verwechslungen mit dem Begriff Migrationen zu vermeiden, einem Feature von EF Core. Die Migrationen in EF Core sind nicht mit Code-First-Migrationen für EF6 kompatibel, da die Umsetzung der Migrationen erheblich verbessert wurde. Es gibt keinen empfohlenen Ansatz zum Portieren Ihres Migrationsverlaufs. Planen Sie lieber einen Neuanfang in EF Core. Sie können die Codebasis und die Daten aus Ihren EF6-Migrationen erhalten. Wenden Sie Ihre endgültige Migration in EF6 an, und erstellen Sie dann eine erste Migration in EF Core. Sie können den Verlauf dann in EF Core nachverfolgen.
Upgradeschritte
Der Upgradepfad wurde in mehrere Dokumente aufgeteilt, die nach Upgradephase und Anwendungstyp organisiert sind.
Bestimmen des EF Core-Flavors
Es gibt mehrere Möglichkeiten, wie EF Core mit Ihrem Domänenmodell und Ihrer Datenbankimplementierung funktioniert. Die meisten Anwendung folgen einem der aufgeführten Muster, und Ihr Portierungsansatz hängt vom Anwendungsflavor ab.
Code als Source of Truth ist ein Ansatz, bei dem alles durch Code und Klassen modelliert wird, also durch Datenattribute, Fluent-Konfigurationen oder eine Kombination. Die Datenbank wird zunächst basierend auf dem Modell generiert, das in EF Core definiert ist, und weitere Updates erfolgen in der Regel über Migrationen. Das wird häufig als Code-First-Ansatz bezeichnet. Dieser Name ist jedoch nicht ganz zutreffend, da ein Einsatz darin besteht, mit einer vorhandenen Datenbank zu beginnen, Entitäten zu generieren und die Verwaltung dann über den Code fortzusetzen.
Datenbank als Source of Truth ist ein Ansatz, der Reverse Engineering oder die Erstellung eines Codegerüsts aus der Datenbank beinhaltet. Wenn Schemaänderungen vorgenommen werden, wird der Code entweder erneut generiert oder aktualisiert, um die Änderungen widerzuspiegeln. Das wird häufig als Database-First-Ansatz bezeichnet.
Der komplexere Hybrid-Mapping-Ansatz folgt dem Prinzip, dass Code und Datenbank separat verwaltet werden und EF Core für die Zuordnung zwischen den beiden Komponenten verwendet wird. Bei diesem Ansatz werden Migrationen in der Regel vermieden.
In der folgenden Tabelle werden die allgemeinen Unterschiede zusammengefasst:
Ansatz | Entwicklerrolle | DBA-Rolle | Migrationen | Gerüstbau | Repository |
---|---|---|---|---|---|
Code First | Entitäten entwerfen, generierte Migrationen überprüfen und anpassen | Schemadefinitionen und -änderungen überprüfen | Per Commit | Nicht zutreffend | Entitäten, DbContext und Migrationen nachverfolgen |
Database First | Reverse Engineering nach Änderungen und generierte Entitäten überprüfen | Entwickler*innen informieren, wenn das Gerüst aufgrund von Datenbankänderungen neu erstellt werden muss | Nicht zutreffend | Per Schemaänderung | Erweiterungen und partielle Klassen nachverfolgen, die die generierten Entitäten erweitern |
Hybrid | Fluent-Konfiguration aktualisieren, wenn Entitäten oder Datenbanken geändert wurden | Entwickler*innen informieren, wenn eine Datenbank geändert wurde, sodass diese Entitäten und Modellkonfigurationen aktualisieren können | – | – | Entitäten und DbContext nachverfolgen |
Der Hybridansatz ist komplexer und erfordert mehr Verwaltungsaufwand als die Code- und Datenbankansätze.
Auswirkungen des Umstiegs von EDMX
In EF6 wurde ein spezielles Modelldefinitionsformat namens Entity Data Model XML (EDMX) unterstützt. EDMX-Dateien enthalten mehrere Definitionen, einschließlich konzeptioneller Schemadefinitionen (CSDL), Mapping-Spezifikationen (MSL) und Speicherschemadefinitionen (SSDL). EF Core verfolgt das Domänen-, Zuordnungs- und Datenbankschema über interne Modelldiagramme und unterstützt das EDMX-Format nicht. Viele Blogbeiträge und Artikel geben fälschlicherweise an, dass EF Core nur den Code-First-Ansatz unterstützt. EF Core unterstützt jedoch alle drei im vorherigen Abschnitt beschriebenen Anwendungsmodelle. Sie können das Modell in der EF Core durch ein Reverse Engineering der Datenbank neu erstellen. Wenn Sie EDMX für eine visuelle Darstellung Ihres Entitätsmodells verwenden, sollten Sie die Verwendung der Open-Source-Toolsuite EF Core Power Tools in Betracht ziehen, die ähnliche Funktionen für EF Core liefert.
Weitere Informationen zu den Auswirkungen der fehlenden Unterstützung für EDMX-Dateien finden Sie im Leitfaden zum Portieren von EDMX.
Durchführen der Upgradeschritte
Es ist nicht erforderlich, die gesamte Anwendung zu portieren. EF6 und EF Core können in derselben Anwendung ausgeführt werden (Verwenden von EF Core und EF6 in derselben Anwendung). Berücksichtigen Sie Folgendes, um das Risiko zu minimieren:
- Wechseln Sie zu EF6 unter .NET Core, sofern Sie das noch nicht getan haben.
- Migrieren Sie einen kleinen Teil Ihrer App zu EF Core, und führen Sie sie parallel zu EF6 aus.
- Verschieben Sie die restliche Codebasis zu EF Core, und kennzeichnen Sie den EF6-Code als veraltet.
Für den Port sind die folgenden allgemeinen Schritte erforderlich:
- Überprüfen Sie Behavior Changes zwischen EF6 und EF Core.
- Führen Sie ihre endgültigen Migrationen (falls nötig) in EF6 aus.
- Erstellen Sie Ihr EF Core-Projekt.
- Kopieren Sie entweder Code in das neue Projekt, führen Sie ein Reverse Engineering durch, oder kombinieren Sie beide Methoden.
- Benennen Sie Verweise und Entitäten um, und aktualisieren Sie Verhaltensweisen:
System.Data.Entity
inMicrosoft.EntityFrameworkCore
- Ändern Sie den Konstruktor
DbContext
so, dass Optionen genutzt werden undOnConfiguring
außer Kraft gesetzt wird. DbModelBuilder
inModelBuilder
- Benennen Sie
DbEntityEntry<T>
inEntityEntry<T>
um. - Wechseln Sie von
Database.Log
zur komplexenMicrosoft.Extensions.Logging
- oder zur einfachenDbContextOptionsBuilder.LogTo
-API. - Wenden Sie die Änderungen für
WithRequired
undWithOptional
(weitere Informationen) an. - Aktualisieren Sie den Validierungscode. Es ist keine Datenvalidierung in EF Core integriert, aber Sie können diese selbst durchführen.
- Befolgen Sie alle notwendigen Schritte für die Portierung von EDMX.
- Führen Sie die Schritte für den jeweiligen EF Core-Ansatz aus:
Viele Aspekte gelten für alle Ansätze. Sie sollten sich also damit befassen, wie Sie mit den Unterschieden zwischen EF6 und EF Core umgehen.