Frage

Ich habe die Situation, dass ich GIS-Software verwende, die die Informationen über GIS-Objekte in einer separaten Datenbanktabelle für jeden Typ/jede Klasse von GIS-Objekten (Straße, Fluss, Gebäude, Meer usw.) speichert und die Metadatentabelle behält, in der sie gespeichert werden Informationen zum Klassennamen und seiner DB-Tabelle.

Diese GIS-Objekte verschiedener Klassen haben einige Parameter gemeinsam, d. h.Beschreibung und ID.Ich möchte alle diese verschiedenen GIS-Klassen mit einer gemeinsamen C#-Klasse (nennen wir sie GisObject) darstellen, was für das ausreicht, was ich im Nicht-GIS-Teil der Anwendung tun muss, der GIS-Objekte des gegebenen GIS auflistet Klasse.

Das Problem für mich besteht darin, wie man diese Objekte mit NHibernate zuordnet, um NHibernate zu erklären, wenn ein C#-GisObject zum Empfangen und Erstellen erstellt wird Verwenden Sie den Tabellennamen als Parameter die aus der Metatabelle gelesen wird (es kann in zwei Schritten erfolgen, ich kann den Tabellennamen im ersten Schritt manuell abrufen und ihn dann beim Abrufen von GisObject-Daten an NHibernate weitergeben).

Hat sich jemand mit einer solchen Situation befasst und ist das überhaupt möglich?

War es hilfreich?

Lösung 2

@Brian Chiasson

Leider ist es nicht möglich, alle Klassen von GIS-Daten zu erstellen, da Klassen dynamisch in der Anwendung erstellt werden.Alle GIS-Daten desselben Typs sollten eine Klasse sein, aber mein Benutzer hat die Möglichkeit, neue Datensätze abzurufen und in die Datenbank einzufügen.Ich kann nicht im Voraus wissen, welche Klassen mein Benutzer in der Anwendung haben wird.Daher funktioniert das In-Front-Zuordnungsmodell pro Klasse nicht, da es morgen eine weitere neue Datenbanktabelle geben wird und die Notwendigkeit besteht, eine neue Klasse mit neuer Zuordnung zu erstellen.

@all Es gibt möglicherweise die Möglichkeit, meine eigene benutzerdefinierte Abfrage in die XML -Konfigurationsdatei meiner GISObject -Klasse zu schreiben und dann in der Datenzugriffsklasse diese Abfrage mit der Abfrage abzurufen

string qs = getSession().getNamedQuery(queryName);

und verwenden Sie die Zeichenfolge „Replace“, um den Datenbanknamen einzufügen (durch Ersetzen einer Platzhalterzeichenfolge), den ich als Parameter übergeben werde.

qs = qs.replace(":tablename:", tableName);

Wie stehen Sie zu dieser Lösung?Ich weiß, dass es in einer unkontrollierten Umgebung, in der der Tabellenname als Benutzereingabe abgerufen würde, ein Sicherheitsrisiko darstellen könnte, aber in diesem Fall habe ich eine Metatabelle mit richtigen und gültigen Tabellennamen für die GIS-Datenklassen, die ich vorher lesen werde Aufrufen der Abfrage zum Abrufen von Daten für die spezifische Klasse von GIS-Objekten.

Andere Tipps

Es hört sich so an, als wäre es hier am einfachsten, eine abstrakte Basisklasse mit allen gemeinsamen GIS-Mitgliedern zu erstellen und dann die anderen X-Klassen zu erben, die nur über die erforderlichen NHibernate-Zuordnungen verfügen.Ich würde dann das Factory-Muster verwenden, um mithilfe Ihrer Metadaten das Objekt des spezifischen Typs zu erstellen.

Eine Möglichkeit besteht darin, eine Schnittstelle zu deklarieren, z. B. IGisObject, die über die auf der Schnittstelle deklarierten allgemeinen Eigenschaften verfügt.Implementieren Sie dann eine konkrete Klasse, die jeder Tabelle zugeordnet ist.Auf diese Weise sind sie immer noch alle vom Typ IGisObject.

Was Ayende sagt, können Sie hier nachlesen: MultiTable-Entitäten.

Aber da Sie separate Tabellen haben, glaube ich nicht, dass es funktionieren wird.Sie können auch vorbeischauen Nhuser-Gruppe

Ich würde wohl die Frage stellen, warum Sie die GIS-Daten direkt in der Datenbank suchen und nicht die API verwenden, die normalerweise als Abstraktion für Sie bereitgestellt wird.Wenn es sich um ein ESRI-System handelt, gibt es Tools, mit denen Sie statische Datenbankansichten in ihren GIS-Objekten erstellen können. Von diesem Punkt an ist es möglicherweise für die Datenextraktion geeignet.

Aus der NHibernate-Dokumentation können Sie eines davon verwenden Vererbungszuordnungen.

Möglicherweise haben Sie auch eine eigene Klasse für jede Tabelle, aber alle müssen eine gemeinsame Schnittstelle implementieren

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