7 Stimmen

Welche Erfahrungen haben Sie mit Entity Framework gemacht?

EF ist jetzt schon eine Weile auf dem Markt und ich überlege, es zu evaluieren - welche Erfahrungen haben Sie gemacht?

Ich interessiere mich sowohl für Web- als auch für Desktop-Anwendungen und vielleicht für einige Vergleiche zwischen EF und anderen ORM-Tools, die Sie verwendet haben.

Die Lernkurve ist ein Faktor, da es sich um ein Team handelt. Ist diese Sache ein aufgeblasenes Chaos oder ist sie schlank und scharf?

Ich habe gehört, dass Microsoft dies intern und in großem Umfang nutzt, das ist ein gutes Zeichen. Wenn Sie darüber nachdenken, wie es in die Cloud-basierte Zukunft passen könnte, für die MS in diesen Tagen sein Geld auszugeben scheint, könnte das auch interessant sein. Denn wenn dies etwas ist, das wir alle irgendwann einmal nutzen werden brauchen Das würde die Prioritätsstufe um ein oder zwei Stufen erhöhen.

Herzlichen Dank!

6voto

Jason Short Punkte 5105

Nun, ich habe gerade ein komplettes System in EF implementiert, es war meine erste echte Erfahrung mit EF in einer Produktionsumgebung. Die App läuft jetzt seit etwa 45 Tagen mit 100 Benutzern, die sie täglich ohne Probleme nutzen.

Ich denke, das Wichtigste ist, dass man sein Denken ändern muss. Wenn Sie wie ein ORM für relationale Datenbanken denken, dann haben Sie bereits die falsche Denkweise. Sie müssen in partiellen Methoden, Objekten und Erweiterungen denken. Sobald man diese grundlegende Denkweise verinnerlicht hat, fangen die Dinge an zu fließen (und man schreibt eine Menge Code um, als man anfing).

Hilfe zu bekommen ist schwer

Der andere frustrierende Teil von EF ist, dass überall, wo man um Hilfe bittet, lauter L2S-Bonzen sitzen, die meinen, sie wüssten schon alles, was man tun muss, und immer wieder versuchen, einem zu sagen, man solle es sein lassen und einfach L2S benutzen... Wenn ich danach gefragt hätte, wie man das in L2S macht, dann wäre ihre Meinung vielleicht gültig...

EF funktioniert gut

Die grundlegende Fähigkeit, Objekte zu erzeugen, die man dann durch Teilmethoden erweitern kann, funktioniert gut. In der Anfangsphase war ich ziemlich frustriert, weil ich immer wieder versucht habe, die Dinge so hinzubekommen, wie ich es in einem SQLCommand tun würde. Wenn man erst einmal erkannt hat, dass man eher an die Anforderungen der Geschäftslogik als an die Funktionsweise von SQL denken kann, kann man viel mehr erreichen.

Ich habe zum Beispiel immer wieder versucht, Joins zu erstellen, um eine Liste von Dingen zu erhalten, die durch einen bestimmten FK für verschiedene Aufgaben miteinander verbunden sind. Als ich schließlich herausfand, dass ich die gesamte Where-Klausel an die FK übergeben kann und diese herausfindet, wie sie die Daten schnell zu mir zurückbringt, war der Code tatsächlich viel schneller.

Enthält Stinkstoff

Die Include-Syntax kommt mir allerdings wie ein Hack vor. Die Verwendung von .Include("Tabellenname.DetailTable") ist unschön. Vielleicht bin ich nur von Intellisense verwöhnt, aber ich hasse diese Syntax.

Last auf Anfrage

Master-Detail-Lasten sind auch ein bisschen hässlich. Wenn Sie sie nicht einbeziehen wollen, können Sie immer ihre Referenz nehmen und sehen, ob sie .IsLoaded und dann .Load aufrufen. Aber warum? Kann das Objekt das nicht für mich tun? Ich habe schließlich eine Erweiterungsmethode für meine Objekte implementiert, die, wenn ich versuche, eine Detailklasse zu laden, die nicht geladen ist, diese bei Bedarf lädt. Mir scheint, das hätte eingebaut werden müssen.

Hinweis: Das im obigen Beitrag erwähnte detaillierte Laden eines gefilterten Datensatzes ist nicht kompliziert, aber auch nicht offensichtlich. Sie können mit Lambda-Ausdrücken filtern.

Wollen Sie das Projekt JEMALS verschieben?

Hier ist der Hauptgrund: Keine Bindung an einen bestimmten Anbieter. Wenn Sie diesen Code jemals in eine andere Datenbank übernehmen wollen, können Sie das mit Linq2SQL NICHT tun. Es gibt kein Anbietermodell. Sie haben vielleicht die Möglichkeit, ein EF-System zu einem anderen Anbieter zu verschieben. In meinem Fall läuft das gleiche Projekt auf SQL Server und VistaDB EF (Alpha) ohne Codeänderungen. Ich kann es also per Xcopy bereitstellen oder mich zur Laufzeit mit einem Server meiner Wahl verbinden.

0 Stimmen

Danke für die nachdenkliche Antwort! Eine Frage: Wenn Sie es noch einmal machen müssten, würden Sie dann immer noch EF verwenden?

0 Stimmen

Ja, ich würde weiterhin EF verwenden. Ich verwende es jetzt bei einem anderen Projekt.

1voto

Timothy Khouri Punkte 30565

EDIT (ja, 3 Jahre später)... Ich hasse EF nicht mehr... Entity Framework 4.1 und höher ist großartig - es löst (endlich) alle Probleme/Mängel, die es in der Vergangenheit hatte. Wohlgemerkt, nicht "4.0", sondern "4.1" beseitigt endlich die hässliche Verwendung von "magischen Strings" usw. Sie hat Contains und alles andere und mehr.

Hier ist mein alter Kommentar von 2008

Ich persönlich hasse EF. ICH LIEBE LINQ-2-SQL. Hier sind meine konkreten Warnungen vor EF:

1) EF unterstützt nicht die Funktion "Enthält". Wenn Sie also eine Tabelle mit 10.000 "Konten" haben und einige Konten zurückgeben möchten, für die der Benutzer eine Liste der IDs angegeben hat, müssen Sie alle 10.000 Konten herunterladen und eine for-Schleife durchführen.

2) EF unterstützt kein "Lazy-Loading": http://www.singingeels.com/Articles/Entity_Framework_and_Lazy_Loading.aspx

3) Wenn Sie eine einfache "Typ"-Tabelle haben, z.B. AccountType... und Sie wollten alle Konten aus der Tabelle Accounts auswählen, bei denen AccountTypeID == 9 ist, gibt es keine saubere Möglichkeit, dies in EF zu tun... EF würde dieses Feld ausblenden und Sie dazu bringen, eine Instanz einer AccountType-Klasse zu liefern.

All diese Probleme werden in L2S gelöst.

EDIT: Oh, Sie haben gefragt, "welche Erfahrungen Sie gemacht haben...", nicht nur über Probleme. In meinem neuen Job haben sie eine 205-Tabellen-Datenbank, 600+ gespeicherte Prozeduren, usw. Ich wollte eine Brücke in die neue Welt des Programmierens schlagen... also habe ich die DAL mit EF in eine 1-1 "Drag all tables in"-Version konvertiert. So sah es aus: Riesen-EDM

Nach nur einer Woche musste ich es herausnehmen und durch L2S ersetzen, da die oben genannten Probleme und noch einige mehr auftraten.

0 Stimmen

Ihnen ist schon klar, dass Sie nicht die GESAMTE Datenbank ständig in einem einzigen Kontext haben sollten, oder?

0 Stimmen

Dem stimme ich voll und ganz zu... aber das Datenbankdesign ist nicht meins, und um den Oldies bei der Umstellung zu helfen, musste die Frage "Alles ist noch da, oder?" mit einem "... ja..." beantwortet werden :)

0 Stimmen

Public ObjectQuery<Konto> AccountsWithID(int id) { return (from x in Accounts where x.AccountType==9 select x) as ObjectQuery<Account>; }

1voto

Nach der Erprobung von EF für ein neues Projekt (ASP.Net/ WCF) habe ich festgestellt:

Die Abfrage kann sehr einfach über LINQ implementiert werden. Die meiste Zeit war die generierte T-SQL auf das Geld.

Die Unterstützung für N-Tier-Anwendungen fehlte weitgehend.

Die Verwaltung von Instanzen im Objektkontext war in n-schichtigen Asp.net-Anwendungen ebenso mühsam.

Dem EF Designer fehlten einige offensichtliche Funktionen, er tauchte immer wieder in das XML ein.

Aktualisierungen sind entweder mit kostspieligen Datenbankumläufen verbunden, oder es gibt verrückte, obskure Methoden, um sie zu vermeiden.

Die Leistungseinbußen waren bei einer POCO- und SP-basierten n/tier-Anwendung deutlich spürbar. Dies war zu erwarten, aber nicht in dem Maße, wie wir es bemerkt haben. Selbst nach der Kompilierung von Abfragen.

Die Zeit, die wir bei der Entwicklung durch die einfache Abfrage einsparen konnten, ging bald bei der Erledigung von zuvor einfachen Aufgaben verloren.

Wie Brain berührt auf, verweist auf Entitätstyp oder Tabellenname durch String war sehr ärgerlich und fühlte sich sehr unordentlich, fand mich schreiben Wrapper, um diese von einem einzigen Punkt zurückgeben.

Wenn Sie eine Anwendung mit nur einer Ebene verwenden möchten, treffen viele der Probleme, auf die wir gestoßen sind, möglicherweise nicht zu.

Aber wir halten die Augen offen nach V2 und hoffentlich einigen Verbesserungen.

0 Stimmen

Danke für die Antwort. Ich hörte zu einem DotNetRocks, wo die Führung von EF im Grunde sagte, dass die wirkliche Güte auf dem Weg ist, mussten sie nur etwas für jetzt zu liefern :/.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X