Subsonic Vs NHibernate

76

Wie ist die Übereinstimmung darüber, wann eines dieser Tools verwendet werden soll, die dem anderen gegenüberstehen? Ich finde Subsonic sehr nützlich, um Dinge schnell erledigen zu können, aber bei großen Projekten ist es nicht skalierbar und bindet Ihr Domain-Modell an Ihr Datenbankmodell. Hier kommt Nhibernate ins Spiel, da es Ihnen leichte POCOs bietet, die nichts mit Ihrem Datenbankmodell zu tun haben, aber die Einrichtungszeit ist viel länger.

Dan
quelle

Antworten:

84

Diese Frage wird mir oft gestellt und es kommt wirklich darauf an, wie viel du fummeln willst. Ich kann Ihnen nicht sagen, wie schädlich Chris Cyvas 'Kommentare zur RE SubSonic-Skalierung waren - und ich habe seitdem darauf reagiert :(.

Der Deal ist - perfekt, SubSonic skaliert sehr gut. In Bezug auf das Projektwachstum - JEDES Tool, das Sie verwenden, erfordert Ihre Aufmerksamkeit. Sogar NHibernate.

Ich habe einen Beitrag darüber geschrieben, wie das Repository-Muster mit DI (wie bei NHIb oder einem anderen Tool) mit SubSonic 2.1 verwendet wird:

http://blog.wekeroad.com/blog/subsonic-writing-decoupled-testable-code-with-subsonic-2-1/

Ich habe auch einen Beitrag über die Leistung von SubSOnic geschrieben:

http://blog.wekeroad.com/blog/subsonic-scaling/

Hoffe das hilft.


quelle
12
Voreingenommen oder nicht, ich habe die letzten 4 Stunden damit verbracht zu untersuchen, was einfacher zu erlernen und zu bearbeiten ist, und die Lernkurve mit SubSonic scheint im Vergleich zu NHibernate sehr gering zu sein ...
RSolberg
1
Ich verwende derzeit das Unterschall-Simple-Repository für ein Projekt. Es ist wirklich einfach zu bedienen, aber leider langsam und ziemlich fehlerhaft. Nach dem Betrachten eines Codes mit dem Profiler wurden ca. 20% der Zeit damit verbracht, Werte aus der Datenbank und den Rest in Subsonic selbst abzurufen. Deshalb suche ich derzeit nach anderen Lösungen.
Kay.one
"Langsam und ziemlich fehlerhaft". Es ist, als würde man sagen, dieser Kommentar sei "albern und eher nicht informativ".
45

Ich würde SubSonic empfehlen, wenn Ihr Projekt mit der ActiveRecord-Ansicht arbeitet, dass die Datenbank Ihr Modell ist. Sie erhalten eine Klasse pro Tisch und alles funktioniert auf magische Weise. Sie können die Dinge natürlich optimieren und überschreiben, aber wenn Sie (oder Ihr Projekt) dem Class-per-Table-Ansatz grundsätzlich nicht zustimmen, würde ich NHibernate betrachten, da es mit dem komplexeren (aber flexibleren) Ansatz der Zuordnung Ihrer Daten beginnt Domain-Modell zu Ihrer Datenbank.

Wenn Sie eine relativ einfache Datenbank verwenden, die unter Ihrer Kontrolle steht (wie in können Sie Spalten ändern, ohne acht Formulare an ein Überprüfungsgremium für die Datenbankabteilung zu senden), würde ich empfehlen, mit SubSonic zu beginnen und zu NHibernate zu wechseln, wenn SubSonic dies nicht tut entspricht deinen Bedürfnissen.

Jon Galloway
quelle
31

Für was es wert ist ... Ich hatte die Gelegenheit, beide Technologien mehr zu nutzen, seit ich diese Frage gestellt habe. Und ich muss bleiben, was, wenn Sie diese Technologien wählen, sehr wenig ausmacht. Sicher, mit NHibernate können Ihre Geschäftseinheiten etwas weniger an Ihre Datenbankstruktur gekoppelt werden, aber ich finde immer noch, dass es viele Fälle gibt, in denen Sie sich immer noch dem Willen der Datenbank beugen müssen.

Meiner Meinung nach besteht die einzig wahre Möglichkeit, Ihr Domänenmodell vollständig von Ihrem Datenbankmodell zu trennen , darin, Ihr eigenes DTOS (im Wesentlichen POCOs für die Weitergabe von Daten) zu schreiben und diese dann wieder dem ORM Ihrer Wahl in Ihrer Datenschicht zuzuordnen. Aber in den meisten Fällen wird dieser Ansatz mich mehr belasten als es wert ist.

Dan
quelle
13

Etwas abseits des Themas, aber in ähnlicher Weise. Haben Sie sich Castle ActiveRecord angesehen, das auf NHibernate geschrieben ist und keine Zeit mehr für die Erstellung von XML-Zuordnungen vom Code zur Datenbank benötigt. Wie bei NHibernate können Sie Ihre Domänenobjekte nach Ihren Wünschen strukturieren und später aus dieser Struktur ein Datenbankschema generieren.

Mit ActiveWriter , einem bereitgestellten Tool, können Sie Domänenobjekten problemlos eine Zuordnung von Ihrer Datenbank zuordnen .

FryHard
quelle
Ich spiele jetzt mit CAR an einem Pilotprojekt. Ich wähle es, weil mir die Idee von ActiveRecord auf etwas gefällt, das so gut getestet ist wie NHibernate. Wenn ich CAR nicht mag, kann ich auf reines NHibernate zurückgreifen. Dies gibt mir einen sicheren Ausgang - das gefällt mir. Ich werde Subsonic in ein paar Monaten zum Vergleich ausprobieren.
BuddyJoe
9

Sie können sich Fluent NHibernate ansehen. Dies macht die Verwaltung von NHibernate zum Kinderspiel. Ich bin mir nicht sicher, wie schwierig es wäre, ein vorhandenes Schema zu ändern, aber wenn Sie eine neue Anwendung erstellen, ist es hilfreich, das Domänenmodell zu definieren und die Datenbank auf so ziemlich jedem DB-Server zu generieren, den Sie sich vorstellen können. Nach dem Lesen der anderen Kommentare hier denke ich, dass Fluent NHibernate NHibernate zur Vereinfachung der Konfiguration mit SubSonic gleichsetzt.


quelle
1
Ich stimme zu. Die automatische Zuordnung von Fluent NHibernate in Kombination mit SchemaExport von NHibernate bietet alle Vorteile von SubSonic ohne Nachteile.
pondermatisch
7

Ich kann keinen guten Vergleich geben, da ich NHibernate noch nicht für ein Projekt verwendet habe, aber ich habe SubSonic verwendet und war sehr zufrieden damit. Bisher bin ich bei der Verwendung auf keine größeren Hindernisse gestoßen.

Schauen Sie sich diesen Beitrag von Rob Conery an, einem der Entwickler von SubSonic. Er spricht darüber, wie Sie Ihren SubSonic-Code vom Rest der App entkoppeln können. Er erwähnt sogar die Tatsache, dass Sie mit dieser Architektur SubSonic später gegen eine andere Datenzugriffsschicht wie NHibernate oder LINQ to SQL austauschen können.

Ich weiß, dass ich Ihre Frage nicht beantwortet habe, aber ich hoffe, das hilft immer noch.

Michael Paladino
quelle
7

Ich habe kürzlich einen Blog-Beitrag über .NET ORMs mit Subsonic und ActiveRecord geschrieben. Nach meiner Erfahrung hängt es davon ab, was das Projekt tut. Subsonic funktioniert viel besser, wenn Sie einen SQL-Hintergrund haben, NHibernate jedoch mehr davon hat. ActiveRecord eignet sich für kleinere Projekte. Ich bin nicht davon überzeugt, dass es für größere Projekte schneller ist als das Festhalten an NHibernate.

Chris S.
quelle
Der von Ihnen angegebene Link funktioniert nicht. Meinst du das? shrinkrays.net/articles/a-look-at-dotnet-orms.aspx
kimsk
5

Ich habe beide bewertet und glaube, es wäre nicht fair, sie übereinander zu empfehlen, ohne zu verstehen, was Ihre Ziele sind. In Ihrer Frage haben Sie die Unterschiede gut dargelegt, und ich glaube, das muss Ihr entscheidender Faktor sein. Persönlich habe ich beide verwendet und werde beide je nach Projekt weiterhin verwenden.

  • NHibernate ist meine Wahl für größere Projekte, da es leichte POCOs verwendet. Wenn ich jemals mein ORM "Ich glaube" austauschen würde, wäre dies viel einfacher zu überarbeiten.
  • SubSonic ist meine Wahl, wenn ich ein kleineres Projekt habe. Ich glaube, dass die Leistung von SubSonic gut skaliert. Ich fühle mich jedoch eng damit verbunden, weil es so in mein Projekt eingraviert ist. In kleineren Projekten kann ich es immer noch ausschalten, weil die Codebasis so klein ist und es mir wirklich hilft, Code wie angekündigt herauszureißen.
Jamey McElveen
quelle
4

Wieder etwas abseits des Themas, aber ich werde Castle ActiveRecord unterstützen - anstatt die Datenbank als Modell zu verwenden (Subsonic-Ansatz) oder Stunden in XML-Spaghetti zu verbringen (NHibernate-Ansatz), platzieren Sie einfach Attribute in Ihren Modellklassen.

Sie können ActiveRecord sogar veranlassen, das Datenbankschema für Sie zu generieren .

Wir haben diesen Ansatz bereits bei einigen Projekten angewendet und haben folgende Vorteile:

  • Einfacher Upgrade-Pfad zu NHibernate, falls dies in Zukunft erforderlich sein sollte
  • Unterstützung für einfache Vererbungsmodelle - z. Auto -> Fahrzeug
  • Das Schema, das es generiert, ist höchstwahrscheinlich so, wie Sie es ohnehin erstellt hätten, sodass Sie mehr Zeit damit verbringen können, die App zu erstellen, als sich Gedanken darüber zu machen, ob Ihr Modell / Ihre Datenbank synchron bleibt.
Großer Sprung
quelle
3

Ich denke, du hast es ziemlich genau verstanden. Subsonic generiert Code, sodass Ihre Geschäftsobjekte Ihre Datenbankstruktur widerspiegeln. nHibernate verwendet Zuordnungsdateien, die Ihre Geschäftsobjekte der Datenbank zuordnen, sodass Ihre Objekte beliebig strukturiert werden können.

Wie groß ist das Projekt? Wird langfristige Unterstützung benötigt? Wird die Kosteneffizienz von Subsonic potenzielle Skalierungsprobleme ausgleichen?

Bob
quelle
3

Wir haben mit Unterschall gebootet und versuchen nun zu bewerten, ob wir jetzt, da wir uns an den Schwachstellen von Unterschall befinden, auf Ruhezustand umschalten werden.

Unsere andere Option besteht darin, einen Mittelweg zu schaffen, auf dem wir Unterschall verwenden, um beliebige Objekte mit ihrer Funktion "Als typisierte Liste ausführen" abzufragen und zu laden, die eine namensbasierte Zuordnung einer beliebigen SQL-Anweisung im Linq-Stil durchführt. Oder um zu versuchen, etwas davon im Ruhezustand neu zu erstellen und den Rest umzugestalten.

Ich sage also, Unterschall macht in kleinen Apps Sinn, aber die Wartung von Unterschall-Apps wird ziemlich haarig. Wir haben besonders schwere Zeiten mit überlappendem Validierungscode und Ereignissen, die durch Code vor / nach dem Code ausgelöst werden. Für ein aktives Aufzeichnungsmuster ist Unterschall definitiv zu 80% vorhanden, macht jedoch etwas Flockiges und verhindert, dass Sie eine echte Kontrolle über Ihre Vererbungshierarchie haben, da jede Klasse eine Tabelle erben muss, um zu dieser Tabelle zurückzukehren.

Entwicklung von Chris
quelle
3

Berücksichtigen Sie Ihre Team- und Projektgröße, wenn Sie ActiveRecord in Betracht ziehen.

Nach meiner Erfahrung ist ActiveRecord eine Abstraktion über NHibernate, die beim Versuch komplizierterer Szenarien wie ein Sieb ausläuft.

Wenn Sie ein mäßig bis stark kompliziertes oder unkompliziertes Schema haben, bleiben Sie bei NHibernate. Sie können es nahezu perfekt schneiden und würfeln.

Der andere Ort, an dem Sie möglicherweise in Schwierigkeiten geraten, ist, wenn Sie eine mäßig komplizierte Abfrage benötigen. ActiveRecord verbirgt einen Großteil der Implementierung von NHibernate ... aber Sie benötigen es für eine komplizierte Abfrage, die sehr schwierig wird, wenn Sie mit HQL nicht vertraut sind. Seien Sie vorsichtig, Teammitglieder hacken nicht nur an den Rändern herum, anstatt NHibernate und HQL zu lernen.

ignu
quelle
2

Umfassen Sie die Impedanzfehlanpassung!

Schau dir das an

:) :)

Oder nicht. Wenn Sie Leistung wünschen, tun Sie es selbst. Wenn Sie es schnell und einfach möchten, wählen Sie NHibernate und ActiveRecord. Wenn Sie gerne so tun, als ob Sie tatsächlich wissen, was auf Datenzugriffsebene vor sich geht, verwenden Sie NHibernate und setzen Sie sich den ganzen Tag mit XML in Verbindung, um viele zu viele zum Laufen zu bringen ... Oder machen Sie es einfach selbst - ADO.Net FTW!

Qerim Shahini
quelle
Der gleiche Stephen Forte sagte jetzt (Stand Dezember 2010): "Da sich die heutige Generation von ORM-Tools weiterentwickelt, werden sie flinker und benutzerfreundlicher, was mehr Entwickler dazu veranlasst, einen zweiten Blick auf die Integration von ORM in ihre Anwendungsarchitekturen zu werfen ". Es gibt nichts Schöneres als Zeit, um einen Mann zur Besinnung zu bringen! :-) devproconnections.com/article/tools-and-products/…
rsenna
2

Ich glaube, Sie sollten sich an eine halten, die Sie am besten nutzen können. Das ultimative Ziel ist die Produktivität und der gute Qualitätscode. Wenn Sie SubSonic in- und auswendig kennen, bleiben Sie dabei, und wenn Sie NHibernate genau kennen, halten Sie sich an NHibernate. Dies ist eine sehr subjektive Frage. Sie sollten auch berücksichtigen, dass Ihr Teammitglied über Fachwissen verfügt. Wenn Sie gut darin sind, können Sie es leicht warten.

Ich habe große Projekte mit SubSonic gesehen, während NHibernate bereits berühmt und weit verbreitet ist.

Die Entscheidung für die Auswahl von ORM hängt nicht nur vom ORM selbst ab.

diese. __curious_geek
quelle
0

Der Rat, den ich zu diesem Thema erhalten habe, ist, dass Subsonic nicht für komplexere Szenarien skaliert werden kann. Wenn Sie also diesen Weg gehen, erhalten Sie einen Job, der versucht, zu einem fortgeschritteneren ORM zu wechseln.

Ich bin daher mehr an der Verwendung von NHibernate für komplexe Fälle und Castle Active Record für einfachere Fälle interessiert und behalte Fluent NHibernate im Auge, was die NHibernate-Zuordnung erheblich vereinfachen sollte (insbesondere, wenn die Unterstützung für konventionelle Zuordnungen verbessert wurde).

Colin Jack
quelle
1
"dass Subsonic nicht für komplexere Szenarien skaliert" Das Problem dabei ist, dass es nichts bedeutet, nur zu sagen. Es gibt weiterhin einen völligen Mangel an glaubwürdigen Beweisen dafür, dass SS nicht skaliert. Ich denke, es ist ein Beweis dafür, dass es manchmal ausreicht, nur etwas im Internet zu sagen.
CarmineSantini
Wenn Sie Hinweise auf Probleme mit der Unterschallskalierung haben, geben Sie diese bitte an. Ich habe persönlich keine Probleme mit der SubSonic-Skalierbarkeit festgestellt.
Jim Geurts