Entity Framework 4 vs. NHibernate

.net entity-framework nhibernate orm

Frage

Es wurde viel über die erste Version von Entity Framework im Web (auch über stackoverflow) gesprochen, und es ist klar, dass dies keine gute Wahl war, wenn wir bereits bessere Alternativen wie NHibernate haben. Ich kann jedoch keinen guten Vergleich von Entity Framework 4 und NHibernate finden. Wir können heute sagen, dass NHibernate unter allen .NET-ORMs führend ist, aber wir können erwarten, dass Entity Framework 4 NHibernate von dieser Position verdrängt. Ich denke, wenn Microsoft wirklich sehr gute Funktionen in EF4 eingespritzt hat, kann dies eine gute Konkurrenz zu NHibernate sein, da es über eine Integration mit Visual Studio verfügt, einfacher zu bedienen ist und den MS-Produkten in den meisten Geschäften Vorrang eingeräumt wird.

Akzeptierte Antwort

EF4 bietet eine "out-the-box" Antwort in Bezug auf die n-Tier-Entwicklung in "Self-Tracking Entities". Niemand hat einen vergleichbaren Code für NHib veröffentlicht.

NHib hat viele Funktionen, die nicht als Teil von EF4 erwähnt wurden. Dazu gehört die Cache-Integration der zweiten Ebene. Es bietet auch eine größere Flexibilität bei der Vererbungszuordnung, eine bessere Integration mit gespeicherten Prozeduren / Datenbankfunktionen / benutzerdefinierten SQL / Triggern, Unterstützung für Formeleigenschaften und so weiter. IMO ist im Grunde nur reifer als ein ORM.


Beliebte Antwort

Update: Ich habe Entity Framework seit Version 4.0 nicht mehr verwendet, daher kann meine Antwort veraltet sein. Ich verwende immer noch NH oder reines ADO .NET in meinen Projekten. Und ich möchte nicht einmal auf die Neuerungen in EF seit 4.0 schauen, weil NH perfekt funktioniert.

Eigentlich ist es ziemlich einfach, sie zu vergleichen, wenn Sie beide verwendet haben. Es gibt einige gravierende Einschränkungen bei EF4. Ich kann einige nennen, denen ich selbst begegnet bin:

EF4 Probleme:

  • Eager Laden und Gestalten des Ergebnisses : Das EF4-Ladungsladesystem (Include ("Path")) generiert unpassendes SQL mit einer Schleife von JOINs, das Tausende (nicht wörtlich) Zeit langsamer für viele-zu-viele-Beziehungen ausführt als handgeschriebenes SQL (es ist effektiv unbrauchbar).
  • Materializer kann zugeordnete Entitäten nicht verwirklichen : Wenn Sie glauben, dass Sie das vorherige Problem durch die Bereitstellung einer eigenen SQL-Abfrage überwinden können, liegen Sie falsch. EF4 kann zugeordnete Entitäten aus JOIN SQL-Abfrage nicht verwirklichen (kartieren), es können nur Daten aus einer Tabelle geladen werden (Wenn Sie also Order.Product haben, wird SELECT * FROM order LEFT JOIN initialisiert. Das Produkt initialisiert nur das Order-Objekt. Ich denke, alle erforderlichen Daten werden in einer Abfrage abgerufen (init). Dies kann durch die Verwendung des EFExtensions-Community-Add-Ons überwunden werden, aber der Code, den Sie dafür schreiben müssen, ist wirklich hässlich (ich habe es versucht).
  • Self-Tracking-Entitäten : Viele sagen, dass Self-Tracking-Entitäten für die N-Tier-Entwicklung geeignet sind, einschließlich der Top-Antwort in diesem Thread. Ich dachte, ich habe es nicht einmal versucht, ich kann sagen, dass sie es nicht sind. Jede Eingabe kann gefälscht werden. Sie können nicht einfach die Änderungen übernehmen, die der Benutzer Ihnen sendet, und sie auf die Datenbank anwenden. Warum geben Sie dem Benutzer keine direkten Daten Basiszugang dann? Auf jede Art und Weise müssen Sie die Daten laden, die der Benutzer gerade von der Datenbank ändert, prüfen, ob sie nicht vorhanden sind, Berechtigungsprüfungen usw. durchführen. Sie können dem Benutzer nicht den Status der Entität anvertrauen, die er an den Server sendet, Sie werden es trotzdem tun Sie müssen diese Entität aus der Datenbank laden und ihren Zustand und andere Dinge bestimmen. Diese Informationen sind also nutzlos. Dies gilt auch für Self-Tracking-Entitäten, es sei denn, Sie führen ein privates vertrauenswürdiges n-Tier-System für den internen Gebrauch aus. In diesem Fall können Sie möglicherweise einfach nur Angaben machen DB-Zugriff (Das sind meine Gedanken zu ST-Entitäten und N-Reifen. Ich habe nicht viel Erfahrung mit N-Tier, daher kann sich das ändern, wenn ich hier etwas missverstanden habe.)

  • Protokollierung, Ereignisse, Integration der Geschäftslogik: EF4 ist wie eine Blackbox, es tut etwas und Sie haben keine Ahnung, was es tut. Bei OnSavingChanges gibt es nur ein Ereignis, bei dem Sie einige Geschäftslogik einfügen können, bevor etwas mit DB passiert. Wenn Sie einige Änderungen an Geschäftsobjekten vornehmen müssen, bevor etwas passiert, müssen Sie im ObjectStateManager nachforschen. Dies ist wirklich hässlich Code kann sehr groß werden. Wenn Sie zum Beispiel das Repository-Muster verwenden und wissen möchten, dass Sie Änderungen an der Datenbank in sauberer Weise vornehmen, werden Sie es mit EF schwer haben.

  • Erweiterbarkeit: Der gesamte EF-Code ist privat und intern. Wenn Ihnen etwas nicht gefällt (und Sie nicht viel mögen, wenn Sie EF ernst meinen), werden Sie dies auf keine Weise ändern können. Tatsächlich bin ich sicher Es ist einfacher, einen eigenen ORM von Grund auf zu schreiben (ich habe es getan) und EF so zu gestalten, wie Sie es brauchen. Schauen Sie sich zum Beispiel die Quelle von EFExtensions an. Sie basiert auf Erweiterungsmethoden und verschiedenen "Hacks", um EF ein wenig nutzbarer zu machen, und der Code ist ziemlich hässlich (und es ist nicht die Schuld der Autoren. Wenn alles in EF privat ist, ist dies die einzige Weg, um es zu erweitern).

Ich kann weiterhin schlechte Dinge über EF schreiben und wie schmerzhaft es für mich war, etwa 20 Seiten damit zu arbeiten, und vielleicht werde ich das auch tun.

Was ist mit NHibernate? Es ist ein völlig anderes Niveau, es ist wie ein Vergleich von PHP mit C #, EF4 ist wie in der Steinzeit, es ist, als wäre EF 10 Jahre hinter NHibernate im Entwicklungsfortschritt, und tatsächlich ist Hibernate 2001 gestartet. Wenn Sie Zeit haben Nhibernate lernen und einschalten, tun Sie es.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum