9. Für Umsteiger von EF 6

Leichtgewichtigkeit, Flexibilität, Erweiterbarkeit und ein vereinheitlichter Modellierungsprozess sind die wichtigen Motivationen bei der Entwicklung der neuen Version. Dabei wird vor allem auf die komplexen Designer und die Modellierung mit XML verzichtet. “Code Only” ist die Devise, wobei wie bisher vorhandene und neue Datenbanken gleichermaßen unterstützt werden.

9.1 Was ist neu?

Die Top-Level APIs ändern sich mit Entity Framework Core nur wenig. Es gibt aber lang erwartete, signifikante Verbesserungen:

  • Batch CUD
    Erstmals wird das EF die Ausführung von multiplen Abfragen mit nur einem Datenbank-Roundtrip unterstützen. In den bisherigen Versionen des Frameworks wird pro INSERT-, UPDATE- und DELETE-Statement eine Abfrage zur Datenbank geschickt. Dies führt häufig zu enorm vielen Abfragen, die von einer Anwendung an die Datenbank gesendet werden, was natürlich zu Lasten der Performance geht. Jetzt werden in vielen Situationen Abfragen vom Framework zusammengefasst, um diese mit einem Roundtrip zur Datenbank zu schicken.
  • Unique Constraints
    Hiermit erfüllt das EF-Team einen weiteren Wunsch der Community, mit 3196 Stimmen in der User Voice genannten Plattform die am häufigsten geforderte Verbesserung. Mit diesem Feature ist es möglich, Fremdschlüsselbeziehungen auf eine definierte Menge von Spalten einer referenzierten Tabelle festzulegen, wobei die Menge der Spalten nicht der Primärschlüssel der referenzierten Tabelle sein muss. Damit können unabhängig vom Datenbankmanagementsystem referentielle Abhängigkeiten und Einschränkungen im Model definiert werden.
  • Generierung von SQL-Abfragen
    Bisher generiert Entity Framework aus einer Linq-Abfrage eine komplette SQL-Abfrage und sendet diese an die Datenbank. Dabei kommt es in vielen Situationen zu sehr komplexen Abfragen, die nur langsam von den Datenbankmanagementsystemen ausgeführt werden können. Um diese Problematik zu entschärfen, betrachtet EF Core Linq-Abfragen etwas differenzierter: Ein neu eingeführtes Model überlässt es dem Linq-Provider zu entscheiden, welche Teile der Abfrage auf welche Art und Weise in der Datenbank ausgeführt werden. Damit können die Provider noch weiter auf das spezifische DB-System hin optimiert werden. Individuelle Features einer Datenbank können so überhaupt erst genutzt und die Ausführung von Abfragen damit verbessert werden.
  • Leichtgewichtiger Unterbau
    Microsoft wird den OR-Mapper an vielen Stellen neu implementieren, das EF-Team möchte den kompletten Mapper auf einen flexiblen, leichtgewichtigen Unterbau setzen. Als Beispiel wird die Verwaltung der Metadaten eines Modells angeführt. Der MetadataWorkspace ist bisher eine sehr träge Komponente, was den vielen Spielarten der Modellierung geschuldet ist. Beispielsweise benötigt man zum Herausfinden einer Tabelle, die zu einer bestimmten Entität gemappt ist, bisher sieben Zeilen Code; vier davon sind selbst komplexere Linq-Abfragen. Mit dem neuen Unterbau des EF Core wird dazu nur noch eine Zeile Code benötigt. Dies ist natürlich weniger fehleranfällig, die Performance muss aber an dieser Stelle sicher noch einmal genauer betrachtet werden.

Der OR-Mapper wurde von Grund auf überarbeitet. Einige in alten Versionen des Entity Frameworks vorhandene Funktionen sind dem zum Opfer gefallen:

  • Multiple Entity Sets per Type (MEST)
    In Entity Framework Core wird es nicht mehr möglich sein, verschiedene Tabellen auf dieselbe Entität zu mappen.
  • Komplexes Mapping zwischen Tabellen und Typen
    Das Kombinieren von TPH, TPT und TPC in einer Vererbungshierarchie wird zukünftig nicht mehr unterstützt. Diese Möglichkeit in alten Versionen des Frameworks ist ein weiterer Grund für die Komplexität des Metadata-Workspaces, das Eliminieren also eine Konsequenz aus der neuen Leichtgewichtigkeit.
  • EDMX
    Das EDMX-Modell-Format wurde gänzlich abgeschafft. Das Speichern der Metadaten zu einem Modell in XML-Form gibt es nicht mehr. Die Code-basierte Modellierung ist nun der einzige Ansatz.
  • ObjectContext
    Auch dem ObjectContext geht es an den Kragen. Der mit dem EF 4.1 eingeführte DbContext ist häufig die erste Wahl bei Entwicklern. ObjectContext-APIs werden in den DbContext verschoben, und der ObjectContext damit überflüssig gemacht – in Hinblick auf existierende Anwendungen wohl eine der gravierendsten Änderungen in Entity Framework Core.

9.2 Primäre Rolle in ASP.NET Core

Das Entity Framework als primärer Datenbankprovider kommt allein durch die Wahl des Authentifizierungsverfahrens in die ASP.NET-Applikation. Grundlage ist die Klasse IdentityDbContext, die die Benutzerverwaltung liefert, zugleich aber selbst von DbContext abstammt – der Basisklasse des Datenbankzugriffs. Wird also mit dem individuellen Authentifizierungsverfahren gearbeitet, geht dies nur mit Entity Framework. Es ist naheliegend, dies dann auch für alle anderen Datenbankaufgaben zu nutzen. Dabei spielt es keine Rolle, ob die Datenbank erst durch das Objektmodell erzeugt wird oder eine bereits vorhandene Datenbank benutzt wird. Auch ein Aufsplitten auf zwei Datenbanken ist denkbar, wenngleich dies die Abfragen an einigen Stellen etwas komplizierter macht, da die Objekte dann in zwei getrennten Kontexten existieren.

Entity Framework ist datenbankunabhängig. Die hier gezeigten Beispiele basieren jedoch ausnahmslos auf dem Microsoft SQL Server. Zum Test habe ich hier MS SQL 2014 benutzt, es sollte aber auch mit den vorherigen Versionen funktionieren. EF Core 1.0 ist sehr jung – Erfahrungen mit anderen Datenbanken und der Qualität der Provider, soweit überhaupt verfügbar, gibt es noch nicht.

Installation ohne die Authentifizierung

Um sicherzustellen, dass der SQL Server-Provider vorliegt, installieren Sie zuerst das passende Paket via Nuget:

Tools > NuGet Package Manager > Package Manager Console

Install-Package EntityFramework.MicrosoftSqlServer –Pre

Achten Sie hier auf die Angabe -Pre – andernfalls installieren Sie die aktuelle Version EF 6 (Stand dieser Aussage: Januar 2016). EF 6 läuft allerdings nicht auf dem Core-Framework, was das gesamte Projekt ad absurbum führt. Die Installation erfolgt im Hintergrund. Nun installieren Sie die Kommandos:

Install-Package EntityFramework.Commands –Pre

Öffnen Sie nun die Datei project.json im Wurzelverzeichnis des Projekts. Suchen Sie den Abschnitt “commands” und ändern Sie den Inhalt wie folgt:

1 "commands": {
2   "web": "Microsoft.AspNet.Server.Kestrel",
3   "ef": "EntityFramework.Commands"
4 },