Freigeben über


Verhaltensänderungen zwischen EF6 und EF Core

Dies ist eine nicht erschöpfende Liste der Verhaltensänderungen zwischen EF6 und EF Core. Es ist wichtig, diese im Auge zu behalten, während Sie Ihre Anwendung portieren, da sie die Funktionsweise Ihrer Anwendung verändern können. Nach dem Umstieg auf EF Core werden sie jedoch nicht als Kompilierungsfehler angezeigt.

Dies ist eine allgemeine Überprüfung, die im Rahmen des Portierungsprozesses berücksichtigt werden soll. Ausführlichere, Fall-für-Fall-Anweisungen finden Sie in den detaillierten Fällen.

DbSet.Add/Attach- und Graph-Verhalten

In EF6 führt das Aufrufen DbSet.Add() einer 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 gleich, außer dass alle Entitäten unverändert markiert sind.

EF Core führt eine ähnliche rekursive Suche aus, aber mit einigen geringfügig unterschiedlichen Regeln.

  • Wenn die Stammentität für einen generierten Schlüssel konfiguriert ist und der Schlüssel nicht festgelegt ist, wird sie in den Added Zustand versetzt.
  • Für Entitäten, die während der rekursiven Suche von Navigationseigenschaften gefunden werden:
    • Wenn der Primärschlüssel der Entität generiert wird
      • Wenn der Primärschlüssel nicht auf einen Wert festgelegt ist, wird der Zustand so festgelegt, dass er hinzugefügt wird. Der Primärschlüsselwert wird als "nicht festgelegt" betrachtet, wenn ihm der CLR-Standardwert für den Eigenschaftstyp zugewiesen wird (z 0 . B. für int, null für string, usw.).
      • Wenn der Primärschlüssel auf einen Wert festgelegt ist, wird der Zustand unverändert festgelegt.
    • Wenn der Primärschlüssel nicht datenbankgeneriert wird, wird die Entität in denselben Zustand versetzt wie der Stamm.
  • Diese Verhaltensänderung gilt nur für die Attach Gruppen und Update Methoden. Add legt Entitäten immer in den Added Zustand, auch wenn der Schlüssel festgelegt ist.
  • Attach Methoden setzen Entitäten mit Schlüsseln in den Unchanged Zustand. Dies erleichtert das "Einfügen, wenn neu, andernfalls bleibt es allein.". Update Methoden stellen Entitäten mit Schlüsseln in den Modified Zustand fest. Dies erleichtert "Einfügen, wenn neu, andernfalls aktualisieren".

Die Grundphilosophie hier ist, dass Update eine sehr einfache Möglichkeit ist zur Verarbeitung von Einfügen und Aktualisieren von nicht verbundenen Entitäten. Dadurch wird sichergestellt, dass alle neuen Entitäten eingefügt werden, und alle vorhandenen Entitäten werden aktualisiert.

Gleichzeitig bietet es weiterhin eine einfache Möglichkeit, Add Entitäten einzufügen. Das Hinzufügen ist meist nur 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 in EF Core finden Sie unter Change Tracking in EF Core.

Code First-Datenbankinitialisierung

EF6 führt eine beträchtliche Menge an 'Magie' durch, um die Datenbankverbindung auszuwählen und die Datenbank zu initialisieren. Einige dieser Regeln umfassen:

  • Wenn keine Konfiguration ausgeführt wird, wählt EF6 eine Datenbank in SQL Express oder LocalDb aus.
  • Wenn sich eine Verbindungszeichenfolge mit demselben Namen wie der Kontext in der Datei der Anwendung App/Web.config befindet, wird diese Verbindung verwendet.
  • Wenn die Datenbank 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 zum Erstellen der Datenbank verwendet.
  • Wenn die Datenbank vorhanden ist und EF6 zuvor das Schema erstellt hatte, wird das Schema auf Kompatibilität mit dem aktuellen Modell überprüft. Eine Ausnahme wird ausgelöst, wenn sich das Modell seit der Erstellung des Schemas geändert hat.

EF Core führt keinen dieser Magie durch.

  • Die Datenbankverbindung muss im Code explizit 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 zu erstellen oder zu löschen, ohne Migrationen zu verwenden).

Benennungskonvention für Code First-Tabellen

EF6 führt den Namen der Entitätsklasse über einen Pluralisierungsdienst aus, um den Standardtabellennamen zu berechnen, dem die Entität zugeordnet ist.

EF Core verwendet den Namen der Eigenschaft DbSet, unter dem die Entität im 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.