ORM-Vergleich: Was kommt zuerst an die Datenbank oder die Klassen?

8

In letzter Zeit habe ich nach verfügbaren .NET-ORMs gesucht. Ich habe bemerkt, dass jeder in einem oder zwei Lagern stationiert ist. In einem Lager wird die Datenbank zuerst erstellt, und das ORM bietet eine einfachere Möglichkeit, auf die Datenbank in einer Anwendung zuzugreifen. Im zweiten Lager existiert das Objektmodell zuerst und das ORM erleichtert das Fortbestehen des Objektmodells in einer Datenbank.

Ich frage oder behaupte jetzt nicht, ob ein Lager besser ist als das andere. Ich kann sicherlich Gründe für jede Design-Methodik sehen. Was mich frustriert, ist aus all den Tutorials und den "ersten Schritten", die ich in letzter Zeit gelesen habe. Keine kommen heraus und sagen ganz am Anfang: "Dieses Tool geht davon aus, dass Sie mit einem bestehenden Datenbank- / Objektmodell beginnen". Für mich ist das ziemlich grundlegend, ob Sie ein ORM gegen ein anderes verwenden würden.

Nachdem ich einige Lektüre gemacht und einige "Hello World" -Projekte erstellt habe, habe ich eine Reihe von Aufzählungspunkten zu den Workflows zusammengestellt, die von den ORMs unterstützt werden, die ich untersucht habe. Kann jemand mit Erfahrung mit diesen Tools mir sagen, ob ich falsche Aussagen gemacht habe oder wirklich wichtige Punkte übersehen habe? Insbesondere würde ich gerne wissen, ob meine Annahmen darüber, ob das Datenbankschema oder das Objektmodell mit jedem Werkzeug zuerst kommen sollte, korrekt sind.

Linq zu SQL

  • Die Datenbank sollte zuerst existieren
  • Funktioniert nur mit SQL Server
  • DataContext-Klasse wird zum Lesen / Schreiben zwischen Klassen und Datenbank
  • verwendet
  • DataContext kann reale physikalische Klassen zurückgeben, oder dynamische Typen können verwendet werden, um Typen basierend auf dem Datenbankschema automatisch zu erstellen.
  • Die Mapping-Standardnamen werden standardmäßig auf Klassennamen und die Eigenschaftsnamen auf Spaltennamen
  • umgestellt
  • Die Zuordnung kann durch Attribute angepasst werden, die in jeder Klasse eingebettet sind

Subsonic (aktiver Datensatz)

  • Die Datenbank sollte zuerst erstellt werden
  • Funktioniert mit einer Reihe von Datenbank-Technologien
  • Klassen werden automatisch aus dem vorhandenen Datenbankschema mithilfe von T4-Vorlagen generiert
  • Die Verbindung zur Datenbank ist vollständig transparent, sobald Klassen generiert werden
    • Aufruf von Klassenkonstruktoren, die automatisch Datensätze in der Datenbank erstellen
    • Beim Ändern der Eigenschaftswerte wird die Datenbank automatisch aktualisiert.

Subsonic (einfaches Repository)

  • Klassenstruktur sollte an erster Stelle stehen
  • Funktioniert mit einer Reihe von Datenbank-Technologien
  • Die Repository-Klasse wird erstellt und mit einer Datenbank verbunden
  • Das Datenbankschema wird automatisch erstellt und aktualisiert, wenn Klassen dem Repository hinzugefügt werden
    • repo.Add<MyClass>(instance);
    • Das Repository verwendet Reflektion zum Erstellen / Aktualisieren des Datenbankschemas
    • Erstellen Sie für jede Zeit eine Tabelle und für jede Eigenschaft eine Spalte

NHibernate

  • Entweder Datenbank oder Klassenstruktur kann zuerst erstellt werden
  • Funktioniert mit einer Reihe von Datenbank-Technologien
  • Klassen in der Endmontage werden mit den Einstellungen für die NHibernate-Zuordnung verknüpft, die Klassen und Eigenschaften den Tabellen und Spalten
  • zuordnen
  • Es gibt zwei Methoden zum Hinzufügen der Zuordnungskonfiguration
    • XML-Dateien, die in der Binärdatei eingebettet sind, <classname>.hbm.xml
    • Attribute, die dem Code hinzugefügt wurden
  • Unterstützt erweiterte Mapping-Konfigurationen, einschließlich eins zu eins, eins zu eins, eins zu eins, viele zu viele, Vererbung etc..l etc ...
Eric Anastas 15.09.2010, 19:57
quelle

3 Antworten

2

Ausgehend von den Kommentaren, die den Entity Framework hervorgebracht haben:

Entity-Framework (wikipedia hat auch einige gut strukturierte Informationen)

  • unterstützt beide Codes zuerst, zuerst das Modell und dann die erste Entwicklung der Datenbank. Der Unterschied zwischen Code zuerst und Modell zuerst besteht darin, dass Sie zuerst im Code zuerst die Entitätsklassen schreiben, während Sie im Modell zunächst das Datenmodell entwerfen und danach Entitäten generiert werden.
  • basiert auf einem Metadatenmodell (EDMX) (obwohl es im Code wohl zuerst fehlt), das auch Zuordnungen definiert; EDMX ist ein XML-Modell, das die Datenbankstruktur, die Entitätsstrukturen und die Zuordnungen zwischen ihnen enthält und von einem in Visual Studio integrierten Designer unterstützt wird. In Code-zuerst werden Zuordnungen in Code und nicht in EDMX definiert.
  • unterstützt mehrere Datenbanktechnologien (ich habe MySql und Oracle verwendet).
  • basierend auf der Generierung von T4-Code (in v4), die neben interessanten Erweiterbarkeitsszenarien auch Folgendes generieren kann:
    • Entities, die von einer Basisklasse abgeleitet sind, die für Entity Framework (EntityObject)
    • spezifisch ist
    • POCO-Entitäten, die überhaupt nicht vom Entity Framework abhängig sind
    • Self-Tracking-Entitäten.
  • funktioniert gut mit RIA-Diensten (Silverlight).
  • unterstützt so ziemlich alle Beziehungstypen, die ich denke, und Vererbung mit mehreren Strategien (obwohl es bei einigen von ihnen einige Probleme geben kann).
  • sehr gute Unterstützung für Linq (Linq to Entities).

Es gibt auch LLBLGen, die ich nicht benutzt habe, aber aus den Kommentaren eines meiner Kollegen ist es nicht so groß.

Ich habe NHibernate schon früher benutzt, wenn auch nur kurz, und der Eindruck war gut; obwohl es damals noch nicht so ausgereift war wie jetzt, war es immer noch eine sehr gute Bibliothek. Ich bin mir nicht sicher, ob ich jetzt zwischen NH und EF wählen müsste ... Ich denke, ich würde mit EF gehen, weil ich das letzte Jahr oder so gebraucht habe und die Entwicklung würde schneller gehen (für mich alleine), aber Feature -WH kann etwas besser sein.

    
Alex Paven 15.09.2010 22:14
quelle
1

Ehrlich gesagt kann jedes semi-anständige ORM sowohl mit der ersten Datenbank als auch mit dem ersten Code umgehen.

Alle ORMs, die in Ihrer Frage enthalten sind (einschließlich EF 4 und LLBLGen Pro 3), können beides tun, aber es kann unterschiedliche Schmerzen geben. Code für LinqToSql zum Beispiel zu tun, ist nicht wirklich das, was es tun sollte, aber ich glaube, es gibt Open-Source-Projekte, bei denen dieses Feature "angeschraubt" wurde. Allerdings gibt es im Grunde keinen Grund, LinqToSql zu empfehlen, da Microsoft stattdessen alle zu Entity Framework drängt.

Im Moment hat NHibernate wahrscheinlich die beste erste Geschichte des gesamten Codes. Es ist schwierig, eine Meinung darüber zu ziehen, auf welcher ORM-Datenbank die erste Gesamtgeschichte der Datenbank zu finden ist, da sie alle sehr gut unterstützt werden, und dieser spezielle Anwendungsfall ist nicht das, worauf Sie Ihre Entscheidung stützen sollten.

Wählen Sie ein ORM basierend darauf, ob es ein gutes ORM ist. Die guten ORMs unterstützen sowohl die Datenbank als auch den Code zuerst.

    
Michael Maddox 16.09.2010 11:32
quelle
1

Ich bewerte auch einige ORM-Tools. Ich habe einige Blogs über meine Erfahrungen geschrieben. Vielleicht hilft es dir

Ссылка

Ссылка

Ссылка

    
Nilesh Gule 17.09.2010 17:32
quelle