Entity Framework 7: Lang ersehnte Neuerungen
Kommentare

Vor einigen Tagen berichteten wir über die Code-basierte Modellierung in Entity Framework 7 und zeigten, welche grundlegenden Änderungen auf Microsofts OR-Mapper zukommen. Dabei wurde verdeutlicht, welche Probleme es in der Vergangenheit mit dem Framework gab und wie das Microsoft-Team diese in der kommenden Version adressieren wird.

Leichtgewichtigkeit, Flexibilität, Erweiterbarkeit und ein vereinheitlichter Modellierungsprozess stehen hier an erster Stelle. Neben diesen Eigenschaften wird es aber nun endlich weitere Features geben, die schon sehr lange von der Entwicklergemeinde verlangt werden. Das Entity Framework scheint mit der Version 7 seinen Kinderschuhen zu entwachsen und viele dem Design geschuldete Probleme werden nach langem Warten nun schließlich gelöst. Welche Neuerungen auf uns zukommen, beschreibt Rowan Miller im ADO.NET Blog.

Entity Framework 7 – was bleibt?

Der DbContext wird weiterhin mit seinem gewohnten API zur Verfügung stehen. Eigene Kontexte werden von der Klasse DbContext abgeleitet und mit dem Typ DbSet werden weiterhin Modellelemente in den Kontexten definiert. Wie gewohnt, wird Linq dann für Abfragen auf den Kontexten und ihren DbSets benutzt. Auch die Änderungsverfolgung in DbContext.ChangeTracker und das datenbankbezogene API in DbContext.Database bleiben erhalten. Das EF-Team zeigt dafür den folgenden Code, der unter EF 6.x und EF 7 äquivalent verwendet werden kann:

using (var db = new BloggingContext())
{
 db.Blogs.Add(new Blog { Url = "blogs.msdn.com/adonet" });
 db.SaveChanges();
 
 var blogs = from b in db.Blogs.Include(b => b.Posts)
             orderby b.Name
             select b;

 foreach (var blog in blogs)
 {
  Console.WriteLine(blog.Name);
  foreach (var post in blog.Posts)
  {
   Console.WriteLine(" -" + post.Title);
  }
 }
}

Änderungen in EF7

Das Team um den OR-Mapper betont, dass die Top-Level APIs sich mit Entity Framework 7 nicht oder nur sehr wenig ändern werden. Unter der Haube gibt es 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. Mit Version 7 wird dieses Manko behoben und Abfragen werden in vielen Situationen vom Framework zusammengefasst, um diese mit einem Roundtrip zur Datenbank zu schicken. Damit reagiert Microsoft auf einen sehr alten Wunsch der Community: In der User Voice ist dieses Feature mit 3030 Stimmen die am zweithäufigsten geforderte Verbesserung.
  • Unique Constraints: Hiermit erfüllt das EF-Team einen weiteren Wunsch der Community, mit 3196 Stimmen in der User Voice, 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.
  • Verbesserte 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 EF7 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 und flexibler 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. Z. B. 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 EF7 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.

Wo gehobelt wird, da fallen Späne – so auch in einem OR-Mapper, der von Grund auf überdacht wurde. Einige in alten Versionen des Entity Frameworks vorhandene Funktionen werden vom EF-Team über Bord geworfen:

  • Multiple Entity Sets per Type (MEST): In Entity Framework 7 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 MetadataWorkspaces, das Eliminieren also eine Konsequenz aus der neuen Leichtgewichtigkeit.
  • EDMX: Das EDMX-Model-Format wird gänzlich abgeschafft. Das Speichern der Metadaten zu einem Model in XML-Form wird es so nicht mehr geben. Code-basierte Modellierung wird der zentrale 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 im neuen Entity Framework.

Trotz der großen und einschneidenden Änderungen hat sich das Team um den OR-Mapper dazu entschlossen, den Namen „Entity Framework“ für das Produkt weiterhin zu verwenden. Ob Microsoft der neuen Version wirklich die Nummer 7 verpasst (oder doch vielleicht eine 10 dran hängt), bleibt abzuwarten.

Microsoft möchte so früh wie möglich eine RTM-Version veröffentlichen, auch wenn einige der alten Funktionalitäten (z. B. Lazy Loading) noch nicht in die neue Version integriert wurden. Mit schnellen Updates und noch kürzeren Release-Zyklen möchte der Anbieter des OR-Mappers diese Funktionen dann schnellstens nachliefern. Damit soll es vielen Projekten und neuen Anwendungen ermöglicht werden, schnell in den Genuss der Verbesserungen zu kommen. Bestehende Anwendungen müssen sich dann noch etwas gedulden, bis alle notwendigen Funktionen zur Verfügung stehen und können erst dann migriert werden.

Fazit

Entity Framework 7 verspricht viele tolle neue Features und Verbesserungen, besonders bzgl. der Performance und Leichtgewichtigkeit des Frameworks. Damit einhergehend müssen Brüche zu alten Version in Kauf genommen werden – fundamentale Brüche: Das Eliminieren des ObjectContext wird z. B. in vielen Projekten zu erheblichem Refactoring führen, sofern man auf die neue Version migrieren möchte. Microsoft ist sich dem sehr wohl bewusst, und versucht dieses Problem, zumindest für neue und junge Projekte, durch schnellere Release-Zyklen zu entschärfen.

Aus technischer Sicht werden in der neuen Version nun endlich längst überfällige Verbesserungen vorgenommen. Ein genauerer Blick lohnt sich auf jeden Fall.

Aufmacherbild: maze von Shutterstock / Urheberrecht: Talvi

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -