4

コンパイルされたエンティティ フレームワーク ドメインと動的に定義された外部データベースを混在させるプロジェクトがあります。ユーザーは、実行時に接続文字列、テーブル名、および列名を指定して、外部システムにアクセスできます。私は以前、動的に生成された SQL を使用して外部システムにアクセスし (もちろん、SQL インジェクションを避けるために慎重に作成しました)、関心のあるテーブルを に読み込み、DataTableこれらを POCO に具体化していました。

現在、私のビューの 90% はIQueryableオブジェクトを使用して DB クエリの構造を検査し、ビューを効率的にフォーマット/ページ/操作しました。これにより、クエリを実行する前にかなりの作業を行うことができました。外部システムからのレコードを含むビューについては、歯を食いしばって を使用しIEnumerable.AsQueryable()ました。

別のソリューションを使用したいと思います。私はLinq-to-SQLに傾倒しています(他の提案も受け付けています)が、動的なMappingSource. また、一部の列はオプションであり、すべての列にマッピングを提供しないと Linq-to-SQL が爆発するかどうかわかりません。

public class ExternalMappingSource : MappingSource
{
    public string[] KeyColumns { get; set; }

    public string NameColumn { get; set; }

    public string DescriptionColumn { get; set; }

    public string TimestampColumn { get; set; }

    protected override MetaModel CreateModel(Type dataContextType)
    {
        // ???
    }
}

このオンラインで適切なリソースを見つけることができませんでした。このクラスをフラッシュするにはどうすればよいですか?

4

1 に答える 1

4

関連する構造 (テーブルとフィールドの値) が事前にわかっている場合は、事前にオブジェクトを用意しなくても、そのデータに基づいてカスタム マッピング ソースをフィードできます。私にとっては、別の理由で、XmlMappingSource オブジェクトを使用することになりました。これは、任意の Xml をフィードするために使用できる .FromXml() メソッドがあるためです。sqlmetal によって作成されたマッピング ファイルをチェックアウトすると、必要な Xml の構造の感触をつかむことができます。

  • VS コマンド プロンプトを開きます (スタート メニューの Visual Studio Tools フォルダーにあります)。
  • ディレクトリをプロジェクトに変更します。
  • コマンド「sqlmetal /map:whatever.map /code yourlinqtosql.dbml」を入力します。これにより、書式設定された Xml を含むwhatever.map ファイルが生成されます。

必要に応じてプログラムで変更して、XmlMappingSource.FromXml() メソッドにフィードします。次に、関連する接続文字列と変更されたマッピング ソースを使用してコンテキストを作成できます。

于 2013-02-27T00:52:01.570 に答える