Behavior Changes zwischen EF6 und EF Core

In diesem Artikel finden Sie eine unvollständige Liste einiger Behavior Changes zwischen EF6 (Entity Framework 6) und EF Core (Entity Framework Core). Berücksichtigen Sie diese beim Portieren Ihrer Anwendung, da hierdurch das Verhalten der Anwendung geändert wird, dies aber nach der Umstellung auf EF Core nicht als Kompilierungsfehler angezeigt wird.

Es handelt sich hierbei um eine allgemeine Überprüfung, die im Rahmen des Portierungsprozesses berücksichtigt werden soll. Ausführlichere Einzelfallanweisungen finden Sie in den detaillierten Fällen.

Dbset.Add/Attach und Graph-Verhalten

In EF6 führt das Aufrufen von DbSet.Add() für eine Entität zu einer rekursiven Suche nach allen Entitäten, auf die in den Navigationseigenschaften verwiesen wird. Alle Entitäten, die gefunden werden und nicht bereits vom Kontext nachverfolgt werden, werden ebenfalls als hinzugefügt gekennzeichnet. DbSet.Attach() verhält sich identisch, mit dem Unterschied, dass alle Entitäten als unverändert markiert werden.

EF Core führt eine ähnliche rekursive Suche aus, allerdings mit etwas anderen Regeln.

  • Wenn die Stammentität für einen generierten Schlüssel konfiguriert und der Schlüssel nicht festgelegt ist, wird sie in den Zustand Added versetzt.
  • Für Entitäten, die während der rekursiven Suche von Navigationseigenschaften gefunden werden:
    • Wenn der Primärschlüssel der Entität im Speicher generiert wird
      • Wenn der Primärschlüssel nicht auf einen Wert festgelegt ist, wird der Zustand auf hinzugefügt festgelegt. Der Primärschlüsselwert wird als nicht festgelegt betrachtet, wenn ihm der CLR-Standardwert für den Eigenschaftentyp zugewiesen ist (z. B. 0 für int, null für string usw.).
      • Wenn der Primärschlüssel auf einen Wert festgelegt ist, wird der Zustand auf unverändert festgelegt.
    • Wenn der Primärschlüssel nicht von der Datenbank generiert wird, wird die Entität in denselben Zustand wie der Stamm versetzt.
  • Dieses Behavior Change gilt nur für die Methodengruppen Attach und Update. Mit der Add-Methode wird Entitäten immer der Zustand Added zugewiesen, auch wenn der Schlüssel festgelegt ist.
  • Attach-Methoden legen den Zustand Unchanged für Entitäten mit Schlüsseln fest. Hierbei wird der Ansatz unterstützt: „Neues einfügen, alles andere ignorieren.“ Update-Methoden legen den Zustand Modified für Entitäten mit Schlüsseln fest. Hierbei wird der Ansatz unterstützt: „Neues einfügen, alles andere aktualisieren.“

Die allgemeine Herangehensweise hier ist, dass die Update-Methode eine sehr einfache Möglichkeit zum Verarbeiten von Einfügungen und Updates von getrennten Entitäten darstellt. Dadurch wird sichergestellt, dass alle neuen Entitäten eingefügt und alle vorhandenen Entitäten aktualisiert werden.

Gleichzeitig bietet die Add-Methode weiterhin eine einfache Möglichkeit zum Einfügen von Entitäten. Die Add-Methode ist oft nur dann hilfreich, wenn keine vom Speicher generierten Schlüssel verwendet werden, sodass EF nicht weiß, ob die Entität neu ist oder nicht.

Weitere Informationen zu diesen Verhaltensweisen von EF Core finden Sie unter Änderungsnachverfolgung in EF Core.

Code First-Datenbankinitialisierung

EF6 verfügt über eine Vielzahl von Kriterien zum Auswählen der Datenbankverbindung und Initialisieren der Datenbank. Zu diesen Regeln gehören:

  • Wenn keine Konfiguration durchgeführt wird, wählt EF6 eine Datenbank in SQL Express oder LocalDb aus.
  • Wenn eine Verbindungszeichenfolge mit dem selben Namen wie der Kontext in der App/Web.config-Datei der Anwendung vorhanden ist, wird diese Verbindung verwendet.
  • Wenn die Datenbank noch nicht vorhanden ist, wird sie erstellt.
  • Wenn keine der Tabellen aus dem Modell in der Datenbank vorhanden ist, wird das Schema für das aktuelle Modell der Datenbank hinzugefügt. Wenn Migrationen aktiviert sind, werden sie verwendet, um die Datenbank zu erstellen.
  • Wenn die Datenbank vorhanden ist und das Schema bereits von EF6 erstellt wurde, wird das Schema auf Kompatibilität mit dem aktuellen Modell geprüft. Wenn sich das Modell seit der Erstellung des Schemas geändert hat, wird eine Ausnahme ausgelöst.

EF Core führt diese Aktionen nicht aus.

  • Die Datenbankverbindung muss explizit im Code konfiguriert werden.
  • Es wird keine Initialisierung ausgeführt. Sie müssen DbContext.Database.Migrate() verwenden, um Migrationen anzuwenden (oder DbContext.Database.EnsureCreated() und EnsureDeleted(), um die Datenbank ohne Migrationen zu erstellen bzw. zu löschen).

Benennungskonvention für Code First-Tabelle

EF6 führt den Entitätsklassennamen über einen Pluralisierungsdienst aus, um den Standardtabellennamen zu berechnen, dem die Entität zugeordnet wird.

EF Core verwendet den Namen der DbSet-Eigenschaft, in der die Entität für den abgeleiteten Kontext verfügbar gemacht wird. Wenn die Entität nicht über eine DbSet-Eigenschaft verfügt, wird der Klassenname verwendet.

Weitere Informationen finden Sie unter Verwalten von Datenbankschemas.