Mit NHibernate mit alter database mit einigen "dynamischen" Tischen

Ich habe eine Legacy-database mit einem ziemlich bösen Design, dass ich einige Anwendungen für schreiben müssen. Ich darf das databasedesign überhaupt nicht berühren, da dies ein zerbrechliches altes System ist, das durch Spucke und Gebete zusammengehalten wird. Ich bin natürlich sehr bewusst, dass dies nicht ist, wie die database in erster Linie entworfen worden sein sollte, aber das echte Leben kommt manchmal in den path ..

Für meine neue Anwendung benutze ich NHibernate (mit Fließend für Mappings und NHibernate LINQ für die Abfrage) und versuche, Dinge richtig zu machen. So gibt es IoC und Repositories und mehr interfacen, als ich zählen kann. Allerdings gibt mir die DB-Struktur einige Kopfschmerzen.

Das System konzentriert sich sehr auf das Konzept der Kunden, und jeder Kunde lebt in einer Kampagne. Diese Kampagnen werden von einer der alten Anwendungen erstellt. Jede Kampagne im System ist in einer Tabelle namens CampaignSettings definiert. Eine der Spalten dieser Tabelle ist einfach eine Textspalte namens "Tabelle", die sich auf eine databasetabelle bezieht, die gleichzeitig mit dem Kampagneneintrag in Kampagneneintragungen erstellt wird. Der Name dieser Tabelle bezieht sich auf den Namen der Kampagne, die so ziemlich alles sein kann, was der Kunde will (innerhalb der Einschränkungen von SQL server (2000 oder 2005)). In diesen Tabellen leben die Kunden.

Also das ist Herausforderung # 1 – ich kenne die Tabellennamen bis zur Laufzeit nicht. Und es wird von Ort zu Ort wechseln – keine statice Kartierung, denke ich.

Um es noch schlimmer zu machen, haben wir Herausforderung # 2 – diese Kampagnen-Tabelle ist auch dynamisch in der Struktur, dh es hat eine bestimmte Anzahl von Spalten, die immer da sind (Kundennummer, Name, Telefonnummer, E-Mail-Adresse und andere Haushaltungsmaterial), und dann gibt es zwei weitere Sätze von Spalten, je nach den Anforderungen des Kunden auf Einzelfallbasis hinzugefügt.

Die alten Anwendungen verwenden SQL, um die Spaltennamen in der Tabelle zu erhalten, und fügen Sie dann hinzu, die es nicht als "benutzerdefinierte Felder" in der Anwendung kennt. Ich muss damit umgehen

Ich weiß, dass ich diese Herausforderungen nicht einfach mit Mapping Magic umgehen kann, und ich bin bereit, einige hässliche SQL zusätzlich zu der ORM-Güte zu machen, die ich von NHibernate bekomme (hier sind auch 20 "einige" statice "Tische was NHibernate schön behandelt) – aber wie?

Ich werde eine Kundenentität schaffen, die ich vermute, dass ich manuell bevölkern kann

SELECT * FROM SomeCampaignTable WHERE id=<?> 

und dann durch die Säulen eins nach dem anderen gehen und Sachen setzen, wo es hingehört. Nicht lustig, aber nötig

Und dann schätze ich, die Struktur des Tisches an erster Stelle zu entdecken, ich könnte SQL wie folgt ausführen:

 SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'SomeCampaignTable' ORDER BY ORDINAL_POSITION 

Und wieder einige manuelle Arbeit, um mein object zu konfigurieren, um die benutzerdefinierten Felder zu behandeln.

Meine Frage ist einfach – wie kann ich das in NHibernate machen? Ist es eine einfache Angelegenheit, einen path zu finden, meinen eigenen SQL zu laufen, dann durchlaufen die Ergebnisse, oder gibt es einen eleganteren path, um die Schmerzen aus ihm heraus zu nehmen?

Während ich schätze, dass diese database-Design gehört in irgendeiner Art von Museum of Torture irgendwo, Antworten wie "Add some views" oder "Change the DB" wird mir nicht helfen – ich werde erschossen werden, wenn ich so etwas vorschlagen.

Danke für alles, was dazu beitragen könnte, meine Vernunft hier zu retten!

Solutions Collecting From Web of "Mit NHibernate mit alter database mit einigen "dynamischen" Tischen"

Sie können in der Lage sein, NHibernate mit Native SQL Entity Queries zu verwenden. Vergiss Linq2NH – nicht, dass ich Linq2NH für jede ernsthafte Anwendung empfehlen würde.

Überprüfen Sie diese Seite.
13.1.2. Entity-Abfragen https://www.hibernate.org/hib_docs/nhibernate/1.2/reference/de/html/querysql.html

Du könntest vielleicht so etwas machen: Karten deiner Entitäten auf der Grundlage einer "fake" -Tabelle, um NHibernate glücklich zu halten, wenn es die Mapping-Dokumente kompiliert (ich weiß, dass du gesagt hast, dass du die DB nicht ändern kannst, aber hoffentlich ok, einen leeren Tisch zu machen Halten Sie NH glücklich).

Führen Sie dann eine Abfrage wie folgt aus: 13.1.2 oben:

 sess.CreateSQLQuery("SELECT tempColumn1 as mappingFileColumn1, tempColumn2 as mappingFileColumn2, tempColumn3 as mappingFileColumn3 FROM tempTableName").AddEntity(typeof(Cat)); 

NHibernate sollte zusammen die Spalten, die Sie mit der zugeordneten Entität zurückgegeben haben, und geben Ihnen die Entität des Typs 'Katze' mit allen properties bevölkert. Ich spekuliere hier aber, ich weiß nicht sicher, ob dies funktionieren wird, es ist die einzige Möglichkeit, die ich mir vorstellen kann, um NHibernate dafür zu verwenden, da du die Tabellen / Spalten nicht zum timepunkt der Kompilierung kennst. Sie können definitiv nicht verwenden HQL, Kriterien, Linq2NH, da Sie nicht wissen, die Tabellen und Spalten zum timepunkt der Kompilierung, und HQL et al alle konvertieren Ihre Zuordnungen in die zugeordneten Spaltennamen, um die zugrunde liegenden SQL zu produzieren. Native SQL Queries sind die einzige Möglichkeit, die ich denke.