ORM für die Verwendung mit Datenbanken mit semiflexiblem Schemadesign

c# dapper orm petapoco sql

Frage

Ich mag den "Mikro" -Ansatz von Dapper, Massive, PetaPoco usw. und ich mag die Kontrolle über die SQL, die wir an die Datenbank senden, die meiste Zeit ist es relativ einfach. Ich mag es auch, mit POCO's zu arbeiten, aber wenn Sie mit einem etwas flexiblen Schemadesign umgehen, geraten Sie oft in Schwierigkeiten :)

Sagen wir, wir haben eine Person entity, die IMMER folgende Eigenschaften hat.

  • Ich würde
  • Name
  • Email
  • Telefon

Aber in einigen Fällen können zusätzliche Eigenschaften wie

  • Spezielle Telefonnummer
  • Sehr angepasster Wert

Ich würde wirklich gerne ein POCO mit den gemeinsamen Eigenschaften, von denen wir wissen, dass sie immer da sein werden. Aber die anderen sind in einer Schlüssel / Wert-Sammlung zugänglich.

Was wäre der beste Ansatz? Und unterstützt das eines der erwähnten "Mirco-Orms"? Ich habe sie alle angeschaut, aber ich habe keinen Hinweis darauf gefunden, aber vielleicht verpasse ich etwas.

Wäre es möglich, dies direkt mit einem SqlDataReader zu tun? Oder wäre die Leistung beim Lesen von Hunderten von Zeilen schlecht, wenn Reflektion zum Erstellen der Objekte verwendet wird? Die erwähnten Orms scheinen alle ziemlich gut zu funktionieren und ich schätze, dass ein DataReader darunter verwendet wird.

Hoffe du kannst helfen :)

EDIT: Ich sollte wahrscheinlich erwähnen, dass wir keine Kontrolle über die Anwendungsarchitektur haben. Dies ist eine ERP-Lösung, mit der der einzelne Kunde seine Anwendung und die zugrunde liegende Datenbank anpassen kann. Das Hinzufügen von Feldern in der Anwendung fügt Spalten in der Datenbank hinzu. Schlechtes ich! um das nicht klarzustellen

Akzeptierte Antwort

Massive kann dies unterstützen, da es Daten in ExpandoObject 's materialisiert:

Die geheime Soße ist das ExpandoObject. Alles, was reingeht und alles, was aus Massive herauskommt, ist ein Expando - mit dem man alles machen kann, was man will. Im Kern ist ein ExpandoObject nur ein IDictionary <string, object>

ExpandoObject implementiert IDictionary<string, Object> und IEnumerable<KeyValuePair<string, Object>> , so dass Sie Mitglieder beliebig aufzählen und testen können.

Der Standard von Massive besteht darin, eine SELECT * -Abfrage auszugeben, sodass das ExpandoObject alle Felder in der Tabelle enthält, auch diejenigen, die Sie nicht kennen.

Sie können Massives aktuellen Code von Github erhalten .

Dapper kann auch dynamische Objekte auswählen, aber im Gegensatz zu Massive kann er nur Daten auswählen und nicht einfügen, aktualisieren oder löschen. EDIT: Überprüfung der Dapper Docs, es scheint, es kann Änderungen vornehmen, da es jede SQL ausführen kann. Es gibt einige neuere Informationen über das Ausführen von Beilagen mit Dapper .


Beliebte Antwort

Sie können sich das dynamische Mapping von nHibernate ansehen.

http://ayende.com/blog/3942/nhibernate-mapping-dynamic-component

Es ermöglicht Ihnen, solche erweiterten Eigenschaften im generischen Directory<string,object> abzurufen. Somit haben Sie Ihre Klassen mit solchen generischen Taschen (Wörterbüchern) und erweitern dynamisch das XML-Mapping.

nHibernate erledigt den Rest für Sie.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow