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:

  1. Wechseln Sie zu EF6 unter .NET Core, sofern Sie das noch nicht getan haben.
  2. Migrieren Sie einen kleinen Teil Ihrer App zu EF Core, und führen Sie sie parallel zu EF6 aus.
  3. 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:

  1. Überprüfen Sie Behavior Changes zwischen EF6 und EF Core.
  2. Führen Sie ihre endgültigen Migrationen (falls nötig) in EF6 aus.
  3. Erstellen Sie Ihr EF Core-Projekt.
  4. Kopieren Sie entweder Code in das neue Projekt, führen Sie ein Reverse Engineering durch, oder kombinieren Sie beide Methoden.
  5. Benennen Sie Verweise und Entitäten um, und aktualisieren Sie Verhaltensweisen:
    • System.Data.Entity in Microsoft.EntityFrameworkCore
    • Ändern Sie den Konstruktor DbContext so, dass Optionen genutzt werden und OnConfiguring außer Kraft gesetzt wird.
    • DbModelBuilder in ModelBuilder
    • Benennen Sie DbEntityEntry<T> in EntityEntry<T> um.
    • Wechseln Sie von Database.Log zur komplexen Microsoft.Extensions.Logging- oder zur einfachen DbContextOptionsBuilder.LogTo-API.
    • Wenden Sie die Änderungen für WithRequired und WithOptional (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.
  6. 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.