2

GISオブジェクトに関する情報をGISオブジェクトのタイプ/クラス(道路、川、建物、海など)ごとに個別のデータベーステーブルに保存し、保存するメタデータテーブルを保持するGISソフトウェアを使用している状況がありますクラス名とその DB テーブルに関する情報。

これらの異なるクラスの GIS オブジェクトは、いくつかのパラメーター (説明と ID など) を共有します。これらの異なる GIS クラスのすべてを 1 つの共通 C# クラス (GisObject と呼びましょう) で表現したいと思います。これは、指定された GIS の GIS オブジェクトをリストするアプリケーションの非 GIS 部分から行う必要があることには十分です。クラス。

私にとっての問題は、メタテーブルから読み取られるパラメーターとしてテーブル名を受け取って使用する C# GisObject を作成するときに、NHibernate を使用してこれらのオブジェクトをマッピングして NHibernate に説明する方法です(2 つのステップで行うことができます。最初のステップでテーブル名を手動で取得し、GisObject データをプルするときにそれを NHibernate に渡します)。

この種の状況に対処した人はいますか?

4

6 に答える 6

1

ここで行う最も簡単なことは、すべての共通 GIS メンバーを含む抽象基本クラスを作成し、必要な NHibernate マッピングだけを持つ他の X クラスを継承することです。次に、Factory パターンを使用して、メタデータを使用して特定のタイプのオブジェクトを作成します。

于 2008-09-09T13:08:51.790 に答える
1

@ブライアン・チアソン

残念ながら、クラスはアプリケーション内で動的に作成されるため、GIS データのすべてのクラスを作成するオプションはありません。同じタイプのすべての GIS データはクラスである必要がありますが、ユーザーは新しいデータ セットを取得してデータベースに入れる可能性があります。ユーザーがアプリケーションでどのクラスを持つかを前もって知ることはできません。したがって、明日は別の新しいデータベース テーブルがあり、新しいマッピングで新しいクラスを作成する必要があるため、クラスごとの事前マッピング モデルは機能しません。

@all GisObject クラスの XML 構成ファイルに独自のカスタム クエリを記述し、データ アクセス クラスで、

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

文字列置換を使用して、パラメーターとして渡すデータベース名を挿入します (プレースホルダー文字列を置き換えることにより)。

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

その解決策についてどう思いますか。テーブル名がユーザー入力としてフェッチされる制御されていない環境ではセキュリティ上のリスクになる可能性があることはわかっていますが、この場合、以前に読み取るGISデータクラスの正しい有効なテーブル名を含むメタテーブルがあります特定のクラスの GIS オブジェクトのデータを取得するためのクエリを呼び出します。

于 2008-09-09T13:50:33.017 に答える
0

なぜデータベースでGISデータを直接追跡し、抽象化として通常提供されるAPIを使用しないのかという質問をしたいと思います。これがESRIシステムの場合、静的データベースビューをGISオブジェクトに作成できるツールがあり、その時点からデータ抽出に適している可能性があります。

于 2008-09-10T05:34:32.763 に答える
0

NHibernate のドキュメントから、継承マッピングの 1 つを使用できます。

テーブルごとに個別のクラスを用意することもできますが、それらすべてに共通のインターフェースを実装させます。

于 2008-09-19T01:15:24.980 に答える
0

これを行う 1 つの方法は、インターフェースで宣言された共通のプロパティを持つ IGisObject などのインターフェースを宣言することです。次に、各テーブルにマップする具象クラスを実装します。そうすれば、それらはすべて IGisObject 型のままになります。

于 2008-09-09T11:51:39.340 に答える
0

ここで Ayende が言っていることを見ることができます: MultiTable Entities

しかし、あなたは別々のテーブルを持っているので、うまくいかないと思います。nhuser グループをチェックアウトすることもできます

于 2008-09-09T11:59:11.647 に答える