Was sind einige der Vorteile eines „Micro-ORM“?

21

Ich habe mich mit sogenannten "Mikro-ORMs" wie Dapper beschäftigt und (in geringerem Maße, da es sich auf .NET 4.0 stützt) Massive, da diese bei der Arbeit möglicherweise einfacher zu implementieren sind als ein vollwertiges ORM seit unserem aktuellen System ist in hohem Maße auf gespeicherte Prozeduren angewiesen und würde ein erhebliches Refactoring erfordern, um mit einem ORM wie NHibernate oder EF zu arbeiten. Was ist der Vorteil einer dieser Funktionen gegenüber einem ORM mit vollem Funktionsumfang? Es scheint , als nur eine dünne Schicht um eine Datenbank - Verbindung , dass Sie noch Kräfte roh SQL zu schreiben - vielleicht bin ich falsch , aber ich war immer der Grund für ORMs gesagt in erster Linie ist , so dass Sie nicht haben , SQL zu schreiben, es könnte automatisch generiert werden; Insbesondere für Verknüpfungen mit mehreren Tabellen und das Zuordnen von Beziehungen zwischen Tabellen, die in reinem SQL nur schwer möglich, mit einem ORM jedoch trivial sind.

Ein Beispiel für Dapper:

var connection = new SqlConnection(); // setup here...
var person = connection.Query<Person>("select * from people where PersonId = @personId", new { PersonId = 42 });

Wie unterscheidet sich das von der Verwendung einer handgehaltenen ADO.NET-Datenschicht, mit der Ausnahme, dass Sie den Befehl nicht schreiben müssen, die Parameter festlegen und die Entität vermutlich mit einem Builder zurückmappen. Sie könnten sogar einen Aufruf einer gespeicherten Prozedur als SQL-Zeichenfolge verwenden.

Gibt es andere greifbare Vorteile, die ich hier vermisse, wo die Verwendung eines Mikro-ORM sinnvoll ist? Ich sehe nicht wirklich, wie es etwas über die "alte" Art der Verwendung von ADO.NET spart, außer vielleicht ein paar Zeilen Code - Sie müssen noch schreiben, um herauszufinden, welches SQL Sie ausführen müssen (was haarig werden kann) und Sie müssen noch Beziehungen zwischen Tabellen abbilden (der Teil, bei dem IMHO ORMs am meisten helfen).

Wayne Molina
quelle
+1: Sie benötigen immer noch eine Abfragesprache, egal was passiert. Sie können sich also auch an etwas halten, das Ihnen vertraut ist, wie z. B. linq oder sql, aber das Zurückgeben anonymer Typen wie in Ihrem Beispiel scheint ein relationales Modell keiner konkreten Domäne zuzuordnen Modell. Das kommt mir komisch vor.
Steven Evers
Ja, ich konnte kein konkretes Beispiel für Dapper finden, auf der Site funktioniert es buchstäblich var dog = connection.Query<Dog>("select Age = @Age, Id = @Id", new { Age = (int?)null, Id = guid });und dann, dog.First().Ageum auf Eigenschaften zuzugreifen.
Wayne Molina
5
Das Beispiel gibt keinen anonymen Typ zurück. Das Schlüsselwort "var" kann anstelle eines konkreten Typs in C # verwendet werden, um die zusätzliche Eingabe zu speichern. Diese Abfrage würde IEnumerable <Person> zurückgeben.
Ed James
1
Der Hauptgrund ist weniger Aufwand, wenn Sie ständig Sprocs einchecken und dann daran denken müssen, etwa zwei Dutzend SQL-Dateien zu aktualisieren, ganz zu schweigen davon, dass Sie Procs für einfachen CRUD-Code gespeichert haben müssen.
Wayne Molina
2
Der Hauptvorteil ist, dass Sprocs nicht verwendet werden, um den gesamten Code (und ich verwende hier absichtlich Code, einschließlich SQL und Ihrer anderen bevorzugten Sprachen) in demselben Versionskontrollsystem zu behalten. Ich bin noch nicht auf eine gute Cross-DB-Datenbank VCS gestoßen.
Ed James

Antworten:

12

Leistungen:

  • Ähnliche Leistung wie bei einem Raw-SqlCommand mit DataReader und Parsing.
  • Sie müssen für den DataReader keine eigene Konvertierungsebene erstellen.

Das ist es, um ehrlich zu sein. Sie haben einen sehr leichten Wrapper für Ihre SQL-Verbindungen, der die Objektkonvertierung für Sie erledigt. Sie können die Abfragen natürlich optimieren, ohne sich mit automatisch generiertem SQL befassen zu müssen.

Nachteile:

  • Nicht einmal leicht typsicher. Wenn Sie in der SQL einen Tippfehler machen, den Ihr CI-Server nicht abfängt, müssen Sie hoffen, dass er bei automatisierten UI- oder Funktionstests abgefangen wird.
  • Ein zu pflegender Schmerz. Sie haben eine Reihe von Inline-SQL-Anweisungen, mit denen verschiedene Abfragen ausgeführt werden, die nicht eng mit der DB-Architektur verknüpft sind. Dies kann leicht zu Abfragen führen, die "zurückbleiben", wenn sich die zugrunde liegende DB-Struktur ändert, was Sie zum Zeitpunkt der Erstellung wiederum nicht sehen werden.

Sie haben ihren Platz, und sie sind ein sehr effektives Tool, das Entwicklern bei der Interaktion mit der Datenbank einen Teil der "Eselarbeit" abnehmen kann, in Wirklichkeit können sie jedoch in großem Maßstab einfach nicht den Platz eines vollständigen ORM einnehmen System für Anfragen, die nicht leistungskritisch sind, einfach wegen der erhöhten Wartungskosten.

Wenn Sie Probleme mit der Leistung von DB-Abfragen haben, empfehlen wir, diese Zuordnungsframeworks nur mit gespeicherten Prozeduren zu verwenden, um während der Kompilierung anzuzeigen, ob Ihre SQL gültig ist (zuzüglich der zusätzlichen Leistungsvorteile). .

Ed James
quelle
Es gibt Bibliotheken, die als Wrapper für diese Micro-Orms verwendet werden können, um das Problem, das Sie mit Tippfehlern ansprechen, zu verringern. ZB: Simple Crud Add-On für Dapper
Srivathsa Harish Venkataramana
3

Auf der Webseite von micro ORM PetaPoco erklärt er einige Vorteile mit anderen ORM. um mehr zu erklären

PetaPoco ist ein winziges, schnelles Single-File-Mikro-ORM für .NET und Mono.

  • Wie bei Massive handelt es sich um eine einzelne Datei, die Sie problemlos zu jedem Projekt hinzufügen können
  • Im Gegensatz zu Massive funktioniert es mit stark typisierten POCOs
  • Wie Massive unterstützt es jetzt auch dynamische Expandos - lesen Sie mehr
  • Wie ActiveRecord unterstützt es eine enge Beziehung zwischen Objekt und Datenbanktabelle
  • Wie SubSonic unterstützt es die Generierung von Poco-Klassen mit T4-Vorlagen
  • Wie Dapper ist es schnell, da es die dynamische Methodengenerierung (MSIL) verwendet, um den Eigenschaften Spaltenwerte zuzuweisen
Christophe Debove
quelle
1

Wie unterscheidet sich das von der Verwendung einer handgehaltenen ADO.NET-Datenschicht, mit der Ausnahme, dass Sie den Befehl nicht schreiben müssen, die Parameter festlegen und die Entität vermutlich mit einem Builder zurückmappen. Es sieht so aus, als ob Sie sogar einen Aufruf einer gespeicherten Prozedur als SQL-Zeichenfolge verwenden könnten.

Ich glaube, das ist der Hauptvorteil eines Mikro-ORM. Um die anderen Vorteile eines ORM zu erzielen, müsste man einen vollwertigen verwenden. Dies und der Code ist relativ klein. Wenn Sie ihn also anpassen müssen, ist dies einfacher.

BlackICE
quelle