Wie kann ich ein ORM für eine Datenbank, deren nutzen Schema ist nicht bekannt, bis zur Laufzeit?

StackOverflow https://stackoverflow.com/questions/136366

Frage

Ich versuche, ORM zu nutzen angesichts der folgenden Anforderungen:

1) Unter Verwendung von .NET Framework (neuester Framework ist in Ordnung)
2) Muss in der Lage Sybase, Oracle, MSSQL verwenden austauschbar
3) Das Schema ist meist statisch, aber es gibt dynamische Teile.

Ich bin ein wenig vertraut mit SubSonic und NHibernate, aber nicht tief.
Ich werde das Gefühl der nörgelnden, dass die ORM kann tun, was ich will, aber ich weiß nicht, wie es nutzen im Moment.

Subsonic ist wahrscheinlich nicht optimal, da es zur Zeit nicht Sybase unterstützen, und meine eigenen Provider zu schreiben für sie über meine Ressourcen und die Fähigkeit, jetzt sind.

# 3 (siehe oben), gibt es ein paar Metadaten Tabellen, die Tabellen beschreiben, welche die Anbieter können „Klammer auf“, um die vorhandene Datenbank.
Nennen wir diese Metatables und MetaFields .

Es gibt eine Basis statisches Schema, das die ORM (NHibernate ATM) behandelt schön.
Doch , ein Anbieter eine Tabelle zur Datenbank hinzufügen kann (physisch), solange sie auch die Daten zu den Metadaten Tabellen fügt ihre Struktur zu beschreiben.

Was ich wirklich möchte, ist für mich der Lage zu sein, „füttern“ die ORM irgendwie mit dieser Metadaten (in einer Weise, dass es versteht) und haben es an dieser Stelle erlauben Sie mir, die Daten zu manipulieren.

Mein primäres Ziel ist die Menge an generischen SQL-Anweisung Gebäude, das ich auf diesen dynamischen Tabellen zu tun habe, zu reduzieren.
Ich würde auch Sybase, Oracle geschickt über die Unterschiede in SQL zu kümmern, um zu vermeiden möchten ist, oder MSSQL.

Mein primäres Problem ist, dass ich keine Möglichkeit ORM über die dynamischen Tabellen bis zur Laufzeit wissen zu lassen, wenn ich Zugriff auf die Metadaten haben werde

Bearbeiten : Ein Beispiel für die Nutzung könnte wie sein hier skizzierte :

IDataReader rdr = new Query ( "DynamicTable1") WHERE ( "ArbitraryId", 2) .ExecuteReader ();.

(aber es sieht nicht wie SubSonic wird funktionieren, da es keine Sybase-Provider (siehe oben)

War es hilfreich?

Lösung

Um diesen Blog Acording Sie in der Tat

Andere Tipps

Wir haben einige der Verwendung von NHibernate, aber wir das Projekt gestoppt, da es uns nicht mit dem ROI zu bieten haben wir wollten. Am Ende haben wir unsere eigene ORM / SQL-Schicht zu schreiben, die sehr gut funktioniert (gearbeitet, seit ich nicht mehr dort arbeiten, ich vermute, es funktioniert immer noch).

verwendet unser System eine Open-Source-Projekt, um die SQL zu generieren (kann mich nicht erinnern, den Namen nicht mehr) und wir bauten alle unsere Fragen in unserer eigenen XML-basierte Sprache (Query Markup Language - QML). Wir könnten dann ein XmlDocument mit wählt, wheres, Gruppen usw. bauen und dann das zu dem SQLEngine senden, die sie in eine SQL-Anweisung drehen würden und ausführen. Wir discusse, aber nie umgesetzt, einen Cache in all diesen Dingen. Das hätte uns erlaubt, die Qmls für häufig verwendete Abfragen zwischenzuspeichern.

Ich bin ein wenig verwirrt, wie die orm zur Laufzeit dann verwendet werden würde? Wenn die ORM würde dynamisch zur Laufzeit etwas bauen, wie weiß der Laufzeitcode, was die ORM dynamisch getan hat?

„hat es an dieser Stelle erlauben Sie mir, die Daten zu manipulieren“ - Was die Daten manipulieren?

ich hier etwas fehlt möglicherweise und i aplogize wenn das der Fall ist. (Ich habe nur wirklich gebraucht bottom up-Ansatz mit ORM)

IDataReader abbildet, nichts zu einem Objekt, das Sie kennen. So Ihr Beispiel geschrieben werden sollen klassische Query Builder verwendet wird.

Haben Sie sich das ADO.NET Entity Framework in Verwendung?

MSDN: LINQ to Entities

Es ermöglicht Ihnen, Datenbanktabellen zu einem Objektmodell in einer solchen Art und Weise abzubilden, die Sie ohne darüber nachzudenken, Händler der Datenbank-Code kann verwendet wird, und ohne geringfügige Abweichungen sich Gedanken über ein DBA zu den tatsächlichen Tabellen vorgenommen. Die Zuordnung wird in Konfigurationsdateien gespeichert, die geändert werden kann, wenn die DB-Tabellen modifiziert werden, ohne dass eine erneute Kompilierung erforderlich ist.

Auch LINQ to Entities verwenden, können Sie Abfragen in einer OO Weise bauen, so dass Sie nicht tatsächlich SQL Query-Strings zu schreiben sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top