スキーマが実行時まで不明なデータベースにORMを活用するにはどうすればよいですか?
質問
次の要件を前提としてORMを活用しようとしています。
1).NET Frameworkの使用(最新のフレームワークは問題ありません)
2)Sybase、Oracle、MSSQLを互換的に使用できる必要があります
3)スキーマはほとんど静的ですが、動的な部分があります。
私はSubSonicとNHibernateにある程度精通していますが、深くは知りません。
ORMは自分がやりたいことをできるというしつこい気持ちになりますが、現時点ではそれを活用する方法がわかりません。
SubSonicはおそらくSybaseをサポートしていないため、おそらく最適ではありません。また、独自のプロバイダーを作成することは、現時点ではリソースと能力を超えています。
#3(上記)には、ベンダーが「ステープル」できるテーブルを記述するメタデータテーブルがいくつかあります。既存のデータベースへ。
これらを MetaTables および MetaFields と呼びましょう。
ベースの静的スキーマがあり、ORM(NHibernate ATM)が適切に処理します。
ただし、ベンダーは、構造を記述するためにデータをメタデータテーブルに追加する限り、データベースに(物理的に)テーブルを追加できます。
本当に欲しいのは、どうにかして「フィード」できるようにすることです。そのメタデータを持つORMが(理解できる方法で)その時点でそれを持っていると、データを操作できるようになります。
私の主な目標は、これらの動的テーブルで行う必要のある一般的なSQLステートメントの構築量を減らすことです。 また、Sybase、Oracle、またはMSSQLに送信されるSQLの違いを心配する必要はありません。
私の主な問題は、メタデータにアクセスする実行時まで動的テーブルについてORMに知らせる方法がないことです
編集:使用例は、ここに概説:
IDataReader rdr = new Query(" DynamicTable1")。WHERE(" ArbitraryId"、2).ExecuteReader();
(ただし、Sybaseプロバイダーがないため、SubSonicが動作するようには見えません(上記参照)
解決
このブログによれば、実際には NHibernateと動的マッピング。ただし、少し調整が必要です...
他のヒント
NHibernateを使用していくつかを行いましたが、必要なROIを提供できなかったため、プロジェクトを停止しました。最終的に、非常にうまく機能する独自のORM / SQLレイヤーを記述しました(私はそこで働いていなかったので、うまくいきました。まだ機能していると思います)。
私たちのシステムはオープンソースプロジェクトを使用してSQLを生成し(名前はもう覚えていません)、すべてのクエリを独自のXmlベースの言語(クエリマークアップ言語-QML)で構築しました。次に、select、wheres、groupsなどを使用してxmlDocumentを作成し、それをSqlEngineに送信します。SqlEngineはそれをSqlステートメントに変換して実行します。このすべてのキャッシュについて説明しますが、実装することはありません。これにより、頻繁に使用されるクエリのQmlをキャッシュできます。
ormが実行時にどのように使用されるかについて少し混乱していますか? ORMが実行時に動的に何かを構築する場合、実行時コードはormが動的に実行したことをどのように知るのですか?
"その時点でデータを操作できるようにする" -データの操作とは何ですか?
ここで何かが足りないかもしれませんが、その場合は謝罪します。 (私は実際にORMでボトムアップのアプローチを使用しただけです)
IDataReaderは、既知のオブジェクトに何もマップしません。そのため、古典的なクエリビルダーを使用して例を作成する必要があります。
ADO.NET Entity Frameworkの使用を検討しましたか
どのデータベースベンダーが使用されているかを考えることなく、DBAが実際のテーブルに対して行ったわずかな変動を心配することなくコーディングできるように、データベーステーブルをオブジェクトモデルにマップできます。マッピングは、再コンパイルを必要とせずにdbテーブルが変更されたときに変更できる構成ファイルに保持されます。
また、LINQ to Entitiesを使用すると、オブジェクト指向の方法でクエリを構築できるため、実際のSQLクエリ文字列を記述しません。