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?
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?
Antworten:
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:
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".
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)?
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.
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.
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.
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.
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.
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:
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.
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.
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.
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).
[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.
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.
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.
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.
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.
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.
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 dbml
Datei (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.
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.