1

ある種のオブジェクトを扱うコンテンツ管理システムを実装しましたが、クライアントは別の種類のオブジェクトを導入しました。その構造と動作はまったく同じですが、別々です。彼らは、一方が一方のオブジェクトタイプを扱い、もう一方がもう一方を扱うことを除いて、各モードが同じように動作するモードを切り替えられるようにしたいと考えています。

最初のオブジェクトタイプがTBL_OBJECTというテーブルに格納され、2番目のオブジェクトタイプがTBL_OBJECT_NEWというテーブルに格納されているとします。既存のコードを使用する方法を探していますが、オンザフライで切り替えて、他のテーブルに切り替えることができます。構造が同じであるため、これは概念的に可能です。唯一の問題は、L2Eでは、テーブル名が属性として保存されてコンパイルされることです。そのため、SQLステートメントの作成プロセスをフックする方法を探しています。これにより、既存のステートメントは次のようになります。

Dim db as New DataContext
Dim query = From obj in db.Objects

TBL_OBJECTテーブルではなくTBL_OBJECT_NEWテーブルに解決されます。これができれば、大量のコードを再利用できます。やや珍しいシナリオだとは思いますが、それが可能になることを心から望んでいます。どんな助けでも大歓迎です!ありがとう。

ちなみに、私はこれにDevArtのLinqConnectを使用しています。単純なL2Eアプローチがこれにどれだけ適用されるかはわかりません。一方、L2EではなくDevArtでそれを行う方法を知っている場合でも、それは非常に役立ちます。

4

1 に答える 1

1

2つの同一のテーブルが1つの概念エンティティにマップされる可能性については認識していません。

LinqConnectとEntityFrameworkの両方に解決策があります。たとえば、違いが1つしかない2つのモデルを切り替えてみることができます(最初のモデルはTBL_OBJECTをマップし、2番目のモデルはTBK_OBJECT_NEWをマップします)。

LinqConnectソリューション

LinqConnectで同じ構造を持つ異なるテーブルを切り替えるには、2つの.lqmlファイルを作成し、それらの1つから現在のDataContextインスタンスのマッピングをロードします。

string mappingFileName;
if (...) // Check whether TBL_OBJECT_A should be used
  mappingFileName = "MyDataContext_A.lqml";
else 
  mappingFileName = "MyDataContext_B.lqml";
Stream contextStream = System.IO.File.OpenRead(mappingFileName);
System.Data.Linq.Mapping.MappingSource mappingSource =
Devart.Data.Linq.Mapping.XmlMappingSource.FromStream(contextStream);
MyDataContext context = new MyDataContext(connectionString, mappingSource);

また、流暢なマッピング(属性やマッピングファイルを使用せずにコードにマッピングを設定するアプローチ)をサポートする予定ですが、現時点ではこのための時間枠を提供することはできません。UserVoiceでこの機能に投票できます。

Entity Frameworkソリューション

メタデータアーティファクト処理プロパティをCopyToOutputDirectoryに設定します。この後、生成されたSSDLファイルに移動し、テーブル名を「TBL_OBJECT」から「TBL_OBJECT_NEW」に変更します。現在の唯一のことは、正しい接続文字列を使用してコンテキストを作成することです(新しい接続文字列をアプリケーション構成ファイルに追加するか、接続文字列全体をObjectContextコンストラクターに渡すことができます)。

于 2011-02-14T17:12:17.910 に答える