Was sind die Kriterien für die Bewertung eines ORM für .NET? [geschlossen]

30

Ich freue mich auf die Auswertung von ORMs.

Ich habe SubSonic , Linq-to-SQL und Entity Framework verwendet . Ich habe ein Entwicklerteam, das von Junioren bis Senioren reicht.

Was sind die Kriterien für die Bewertung eines ORM für .NET?

Nickz
quelle
8
Es gibt kein Bestes. Es gibt viele Optionen, die Vor- und Nachteile haben. Jeder bringt etwas anderes auf den Tisch.
Tony
Eine Behauptung zur Terminologie: Ich würde sagen, dass SubSonic mit Sicherheit kein ORM ist. Eher ein relationaler Exposer. Es können nur Klassen generiert werden, die Ihr Datenbanktabellenschema direkt widerspiegeln. Es funktioniert größtenteils einwandfrei, aber dieser Entwurfspunkt ist sehr wichtig, da er sich auf einem ganz anderen Spielfeld als EF & NHib befindet.
Quentin-Star
1
@qstarin: Das macht SubSonic genauso zu einem ORM wie LINQ-to-SQL.
John Saunders
Sehr guter Punkt, John und Qstarin. Es ist eine feine Linie, was Sie als Exposer für relationale Beziehungen zu Objekten einstufen würden. SubSonic 3.0 bietet Funktionen, die den Konzepten von ORM entsprechen. Wiki sagt. "Konvertieren von Daten zwischen inkompatiblen Typsystemen in objektorientierten Programmiersprachen. Dadurch wird eine" virtuelle Objektdatenbank "erstellt, die in der Programmiersprache verwendet werden kann." außerdem auf ormbattle.net gilt SubSonic als ORM. Vielen Dank für Ihr Feedback
Nickz
2
Ich sehe Linq-to-SQL eher wie einen verherrlichten SQL-Generator als wie einen ORM ...
Freitag,

Antworten:

43

Es ist eine geladene Frage.
Es gibt viele sehr gute ORMs, die sich dem Thema mit unterschiedlichen Philosophien nähern.
Keiner ist perfekt durch und alle neigen dazu, komplex zu werden, sobald Sie von ihrem goldenen Pfad abweichen (und manchmal sogar, wenn Sie daran festhalten).

Was Sie sich bei der Auswahl eines ORM fragen sollten:

  1. Was muss es für Sie tun?
    Wenn Sie bereits eine Reihe von Anforderungen für Ihre Anwendung haben, sollten Sie das ORM auswählen, das diesen Anforderungen besser entspricht, als ein hypothetisches "Bestes".

  2. Sind Ihre Daten geteilt oder nur lokal?
    Ein Großteil der Haarigkeit in ORM wird dadurch verursacht, wie sie mit Parallelität und Änderungen an den Daten in der Datenbank umgehen, wenn mehrere Benutzer eine Version derselben Daten besitzen.
    Wenn Ihr Datenspeicher für einen einzelnen Benutzer bestimmt ist, leisten die meisten ORMs gute Arbeit. Stellen Sie sich jedoch in einem Mehrbenutzerszenario einige schwierige Fragen: Wie wird das Sperren gehandhabt? Was passiert, wenn ich ein Objekt lösche? Wie wirkt es sich auf andere verwandte Objekte aus? Funktioniert der ORM in der Nähe des Metalls des Backends oder werden viele Daten zwischengespeichert (Leistungsverbesserung auf Kosten der Erhöhung des Stalenitätsrisikos)?

  3. Ist das ORM für Ihre Anwendung gut geeignet? Es kann schwierig sein, mit einem bestimmten ORM zu arbeiten (viel Leistungsaufwand, schwer zu codieren), wenn er in einem Dienst verwendet wird oder sich in einer Web-App befindet. Es kann im Gegenteil für Desktop-Apps großartig sein.

  4. Müssen Sie datenbankspezifische Erweiterungen aufgeben?
    ORMs verwenden in der Regel den SQL-Satz mit dem niedrigsten gemeinsamen Nenner, um sicherzustellen, dass sie mit vielen verschiedenen Datenbank-Back-Ends arbeiten.
    Alle ORMs beeinträchtigen die verfügbaren Funktionen (es sei denn, sie zielen speziell auf ein einzelnes Backend ab). Einige bieten jedoch die Möglichkeit, zusätzliche Verhaltensweisen zu implementieren, um bestimmte Verbesserungen zu nutzen, die im ausgewählten Backend verfügbar sind.
    Eine typische datenbankspezifische Verbesserung sind beispielsweise die Funktionen für die Volltextsuche. Stellen Sie sicher, dass Sie in Ihrem ORM auf diese Funktionen zugreifen können, wenn Sie sie benötigen.

  5. Wie verwaltet der ORM Änderungen im Datenmodell?
    Einige können die Datenbank innerhalb eines bestimmten Maßes automatisch aktualisieren, andere tun nichts und Sie müssen die Drecksarbeit selbst erledigen. andere bieten ein Framework für die Verarbeitung von Änderungen, mit dem Sie Datenbankaktualisierungen steuern können.

  6. Denken Sie daran, Ihre Anwendung an die Objekte des ORM zu koppeln, oder ziehen Sie es vor, mit POCOs umzugehen und einen Adapter für die Persistenz zu verwenden?
    Ersteres ist in der Regel einfach zu handhaben, es entstehen jedoch überall Abhängigkeiten von Ihren ORM-spezifischen Datenobjekten. Letzteres ist flexibler und kostet etwas mehr Code.

  7. Müssen Sie Ihre Objekte jemals aus der Ferne übertragen?
    Nicht alle ORMs sind gleich, wenn es darum geht, Objekte von einem Remote-Server abzurufen. Schauen Sie sich genau an, was möglich oder unmöglich ist. Einige sind effizient, andere nicht.

  8. Gibt es jemanden, an den Sie sich wenden können, um Hilfe zu erhalten?
    Gibt es gute kommerzielle Unterstützung? Wie groß und aktiv ist die Community rund um das Projekt?
    Welche Probleme haben Benutzer mit dem Produkt?
    Erhalten sie schnelle Lösungen?

Ein paar ORMs, die ich mir angesehen habe:

  • XPO
    vom Entwickler Express: ist klein und einfach, Code-zentriert. Sie verwenden es für ihr Anwendungsframework eXpressApp .
  • NHibernate
    ist kostenlos, aber die Lernkurve ist ziemlich steil. Viele gute Sachen, aber es ist schwer zu finden, was manchmal in der fragmentierten Dokumentation wirklich relevant ist.
  • LLBLGen Pro
    sehr ausgereiftes Projekt, nicht das einfachste, aber es wurde viel darüber nachgedacht.
  • Entity Framework
    GEtting gibt. Die letzten Veröffentlichungen sind ziemlich gut und MS hört zu, obwohl es im Vergleich zu anderen älteren ORMs noch ein bisschen jung ist.
  • DataObject.Net
    Sieht vielversprechend aus, ist aber auch ein bisschen neu, um ein wichtiges Projekt darin zu riskieren, IMHO. Ziemlich aktiv.

Es gibt natürlich noch viele andere.

Sie können sich die umstrittene Website ORM Battle ansehen, auf der einige Leistungsbenchmarks aufgeführt sind. Dabei müssen Sie jedoch berücksichtigen, dass die Geschwindigkeit nicht unbedingt der wichtigste Faktor für Ihr Projekt ist und dass die Hersteller der Website DataObject.Net sind.

Renaud Bompuis
quelle
3
Was hast du gewählt, wenn du das wusstest?
Steven Evers
danke Renaud Bompuis, ich habe noch nichts von den aufgelisteten ORMs gehört. Die Informationen, die Sie zur Verfügung gestellt haben, sind ein guter Anlass zum Nachdenken. Danke.
Nickz
1
@SnOrfus: Ich verwende immer noch XPO, aber ich werde auf LLBLGen migrieren. Es ist solide, ausgereift und Sie behalten die Kontrolle (so können Sie sich immer noch die Hände schmutzig machen, wenn Sie es brauchen / wollen) und es ermöglicht eine angemessenere Trennung von Bedenken und Wiederverwendung von Objekten (über den Adapter).
Renaud Bompuis
3
Es ist erwähnenswert, dass sich Entity Framework jetzt in Version 4.1 befindet und es sich jetzt sicherlich lohnt, einen Blick darauf zu werfen.
Sean Kearon
Ich liebe gespeicherte Prozesse auf dem Server und LINQ auf dem Client. Versuchen Sie, dies abzustimmen! Keine Lernkurve, keine Überraschungen, keine Versionierung, keine Überraschungen!
NoChance
14

Ich benutze NHibernate und finde es ziemlich gut.

In meinem Fall mit einer MS SQL-Datenbank verknüpft, aber Sie können eine Verbindung zu anderen Datenbanken herstellen.

Die Inbetriebnahme dauert nicht lange. Ordnen Sie Ihr Objekt einfach dem Modell zu. Ich verwende eine XML-Datei, aber Sie können es fließend im Code ausführen. Es gibt eine großartige Community, und ich persönlich habe festgestellt, dass Ayendes Arbeit sehr hilfreich ist - ich verwende NHProf, ein SQL-Profilierungswerkzeug.

Ich benutze meistens die Out-of-the-Box-Funktionen - direktes Objekt-Mapping, aber ich benutze auch die Hibernate Query Language, die ziemlich einfach zu bekommen ist.

Sam J
quelle
Seien Sie vorsichtig, NHibernate kann für kompliziertere Modelle schwierig sein. Alles ist gut dokumentiert und macht sehr viel Sinn, aber wenn Sie sich nicht bewusst sind, können Sie auf Probleme stoßen. Das heißt, die Lernkurve ist hoch, aber sie ist ausgezeichnet.
Matt Olenik
danke Sam, ich habe nhibernate nicht verwendet, aber es scheint eine umfangreiche Konfiguration im Vergleich zu SubSonic, Linq-to-SQL und Entity Framework zu erfordern. Dies wäre nicht ideal für mein Entwicklungsteam.
Nickz
Wenn Sie überhaupt interessiert sind, gibt Ayende einen NHibernate-Workshop auf der YOW Australia-Konferenz - yowconference.com.au/melbourne/events_tracks/… - im November / Dezember. Einer der Leute, mit denen ich zusammenarbeite, hat es eine Weile benutzt, also hatte ich den Vorteil, von ihm zu lernen.
Sam J
3
@Nick der größte Teil der Konfiguration kann automatisiert werden. Ich würde mir auch das fließende Add-On ansehen.
Stonemetal
@Nick, @stonemetal stimmte zu, Fluent NHibernate macht die Dinge viel einfacher. Es ist nicht so schnell wie SubSonic, aber dennoch einen Blick wert.
Matt Olenik
6

Leider hatten wir in meinen letzten drei Jobs drei einheimische ORMs. In jedem Fall saugten sie meist aus unterschiedlichen Gründen.

Ich habe kürzlich Entity Framework 4 und seine POCO-Unterstützung evaluiert (eine schöne exemplarische Vorgehensweise finden Sie hier ) und bin wirklich beeindruckt, wie schön es für mich bleibt und mir das Gefühl gibt, wieder zu programmieren, anstatt Daten zu hüten.

Jesse C. Slicer
quelle
Ich höre, ich war in einer ähnlichen Position wie einheimische ORMs. Danke für die Rückmeldung.
Nickz
3
Einheimische ORMs saugen immer. Die besten sind immer schlechter als die schlechtesten öffentlichen ORMs.
Jaco Pretorius
@JacoPretorius Es gibt Gegenbeispiele dazu ... aber "in der Regel" ...
09.02.12
3

Ich mag Linq zu SQL sehr. Es ist einfach und hat einen anständigen Designer. Ich hoffe jedoch, das Leben zugunsten des Entity-Frameworks zu beenden. Ich möchte in der Lage sein, die Fähigkeit zu nutzen, die Generatoren so zu modifizieren, dass ich angepasste Objekte haben kann.

Der größte Vorteil, den diese gegenüber anderen haben (meiner Meinung nach), ist, dass sie mit VS nicht mehr kompatibel sind. Dies ist auch insofern negativ, als Sie MS ausgeliefert sind (siehe Linq to Sql).

Jeremy Roberts
quelle
3

[HAFTUNGSAUSSCHLUSS: Ich arbeite für DevExpress]

Hier sehen Sie Screenshots typischer Anwendungen, die mit DevExpress-Anwendungsframeworks erstellt wurden . Diese Seite enthält auch einen kurzen Überblick über unsere Produkte. Für detailliertere Informationen zum Grund empfehle ich Ihnen, die entsprechenden Produktseiten auf unserer Website zu besuchen.

In Bezug auf DevExpress XAF und XPO finden Sie hier eine gute Erklärung, warum Sie sich für unsere Anwendungs-Frameworks entscheiden sollten. Außerdem bieten wir Support und Dokumentation, was ebenfalls wichtig und erwähnenswert ist. Bei Fragen können Sie sich gerne an uns wenden.

Dennis Garavsky
quelle
Ich benutze immer noch XPO und freue mich über die bevorstehenden Updates.
Renaud Bompuis
2

Wir verwenden NHibernate + Fluent NHibernate mit Linq-to-Sql für kleine Projekte. Der Grund dafür ist:

1) (Nicht der Hauptgrund) NHibernate scheint einen höheren "Respekt" -Faktor unter Entwicklern zu haben (ist das wahr?),

2) Im Vergleich zu Linq-to-SQL ermöglicht nHibernate die ORM-Zuordnung zwischen Datenbankobjekten und Entitäten, die keine 1-zu-1-Zuordnung vornehmen.

3) Wir haben nHibernate nicht ausführlich mit Entity Framework 4.0 verglichen, aber hier ist ein guter Vergleich: http://ayende.com/blog/archive/2010/01/05/nhibernate-vs.-entity-framework-4.0.aspx

nHibernate hat eine ziemlich steile Lernkurve und seine XML-Maps können sehr ausführlich sein. Beginnen Sie jedoch mit der Fluent Nhibernate-Site-Dokumentation und arbeiten Sie sich rückwärts vor.

fjxx
quelle
1

Es gibt kein "bestes" ORM - Framework, da alle unterschiedliche Kombinationen von Stärken und Schwächen aufweisen. Wenn Entwickler sich darauf konzentrieren, einen Bereich zu verbessern, gibt es andere Bereiche, die darunter leiden (Code first vs Modell zuerst vs Datenbank zuerst).

Andererseits gibt es einige sehr gute, von denen einige besser zu Ihren persönlichen Umständen und Ihrer Philosophie passen als andere.


Bearbeiten: Für was es sich lohnt, verwende ich derzeit Linq to SQL - hauptsächlich, weil es dort ist, teilweise, weil es bei minimalem Aufwand viel richtig macht und wahrscheinlich wieder zu Entity Framework übergehen wird, "weil es dort ist" (obwohl es ähnlich auch ist Vieles über EF4 ist richtig, genauso wie einige Sachen, die falsch sind. Insbesondere bei letzteren muss es um die Leistung gehen, aber für die meisten meiner Fälle ist dies kein großes Problem, und die Möglichkeit, dynamische Daten und OData von den Modellen (L2S und EF) aus auszuführen, hat erhebliche Vorteile für mich in Bezug auf: billig "gewinnt.

Murph
quelle
Danke für dein Feedback Murph. Ich stimme dem "besten" ORM zu. Ich bin jedoch bestrebt, eine solche Vereinheitlichung einzuführen. Die Verwendung eines ORM hilft neuen Entwicklern und bestehenden Entwicklern in meinem Team. Derzeit wird es immer schwieriger, mit Subsonic, ADO.net, Linq-to-SQL usw. zwischen Projekten und Wartung zu wechseln.
Nickz
Oh, ich habe kein Problem mit der Suche nach einem am besten geeigneten ORM für Ihre Anwendungsfälle und stimme voll und ganz dem Wunsch zu, die Frage hier zu stellen. Ich führe gerade eine vergebliche Kampagne gegen die Verwendung des Wortes "BEST" in Stapelwechselfragen (-:
Murph
1

Ich würde Ihnen raten, sich DevExpress XPO anzuschauen . Zusammen mit DevExpress XAF wird dies jedem Entwickler das Leben leichter machen, sobald seine Lernkurve überschritten ist.

Yogi Yang 007
quelle
XAF basiert auf XPO, dem ORM. XAF selbst baut darauf auf und fügt die Logik und "automatische" Benutzeroberfläche usw. hinzu
Sascha
Erklären Sie bitte, warum Sie glauben, dass DevExpress XAF das Leben eines Entwicklers erleichtert.
@Sascha, danke für deinen Hinweis. Ich habe meinen Beitrag korrigiert.
Yogi Yang 007
@Mark, XAF und XPO fungieren sowohl als ORM- als auch als UI-Generator, sodass es Entwicklern leicht fällt, voll funktionsfähige Apps in .NET mit minimalem Codierungsaufwand zu erstellen.
Yogi Yang 007
Ein Kommentar von meiner Seite zu XAF: Es ist ein großartiges System für mittelkomplexe Geschäftslogikumgebungen, da es die Entwicklungszeit für die Faktoren beschleunigt. Nachteil ist, dass es an bestimmten Grenzen wiederum sehr zeitaufwändig ist, diese zu verlängern. Zum Beispiel werden hierarchische Benutzer (zusammen mit logischen wie Teams) und "ein Benutzer kann möglicherweise nur Elemente von sich selbst und / oder seinen Untergebenen sehen" nicht sofort unterstützt. XAF hat also Vor- und Nachteile, dass es wirklich evaluiert werden muss, wenn es für ein Projekt geeignet ist - IMHO. Aber es ist definitiv eine gute Grundlage, wenn es passt.
Sascha
1

Wir hatten viel Glück mit Entity Framework. Unsere Situation ist jedoch etwas ungewöhnlich: Wir erfassen Daten für das Berichtsteam, sodass es die Datenbank tatsächlich entwirft. Wir bekommen die DB und verwenden dann einfach EF, um daraus die Datenzugriffsklassen zu generieren. Funktioniert hervorragend für uns, aber wir führen nur Bulk-Datenladevorgänge durch, sodass ich nicht garantieren kann, wie gut dies in einer transaktionaleren Umgebung funktioniert.

TMN
quelle
2
Ja, ich bin ein Fan von EF 4, es ist viel besser als die vorherige Version.
Nickz
1

NHibernate (+ FluentNHibernate) wäre die Standardoption für mich. Es ist sehr flexibel, erweiterbar und robust. Es hat eine große Anzahl von Benutzern und es wird sehr aktiv gepflegt. Der Nachteil ist die steile Lernkurve.

MindScape's LightSpeed ist einfach und benutzerfreundlich, aber dennoch ziemlich flexibel und fähig. Es verfügt über eine Designeroberfläche wie L2S / EF und eine UnitOfWork-Implementierung.

rmac
quelle
MindScape's LightSpeed ​​sieht wirklich interessant aus.
Nickz
1

Nun, es gibt keine "beste" Wahl, aber ich würde sagen, dass reguläres altes Linq to SQL Ihren Anforderungen entspricht. Es ist kein "echtes" ORM an sich, aber es ist sehr leicht und bietet Ihnen die Flexibilität, Code zu schreiben, ohne sich dessen bewusst zu sein, wenn dies sinnvoll ist. Was ich damit meine ist, dass Sie weiterhin wie gewohnt Code schreiben können, ohne sich wirklich über Linq bewusst zu sein, außer über die dbmlDatei (en). Sie können weiterhin mithilfe des Repository- oder Gateway-Musters Abstraktionen darüber schreiben, und L2S erfüllt die Hauptaufgabe eines ORM, nämlich die Umgehung der objektrelationalen Abweichung.

Entity Framework ist ein bisschen schwer, und obwohl ich mich nur ein bisschen damit beschäftigt habe, ist es mehr "in your face" als einfaches Linq to Sql, aber EF ist viel mehr ein echtes ORM als Linq. Ich würde mir alle Kriterien ansehen, nach denen Sie in einem ORM suchen. Ist es nur, weil Sie vermeiden möchten, dass Sie unformatiertes SQL schreiben müssen, oder, schlimmer noch, Hunderte von gespeicherten Prozeduren? Benötigen Sie einige zusätzliche Funktionen, die Linq to Sql nicht bieten kann? Sie müssen diese Fragen beantworten, aber basierend auf Ihrer kurzen Anforderung ("leicht und benutzerfreundlich") denke ich, dass Linq etwas einfacher als etwas wie Subsonic ist und in Visual Studio integriert ist.

Wayne Molina
quelle
0

ECO :) Es ist viel mehr als ein ORM, während es Zustandsautomaten und ausführbare OCL (nämlich EAL) unterstützt. Es gibt eine kostenlose Version mit einer Beschränkung auf 12 Domänenklassen, die meiner Meinung nach für kleine Projekte recht ordentlich sein sollte.

Wilhelm
quelle
4
Es wäre hilfreich, wenn Sie erklären würden, warum.