1

2つのEDMXを別々のアセンブリで、同じデータベースの上に
使用して、両方を使用するlinq-to-entitiesクエリを作成するにはどうすればよいですか?

例えば

これが私がやろうとしていることです:

using (var context1 = new Entities1())
{
    using (var context2 = new Entities2())
    {
        var items2 = context2.Items.Where(item2 => item2.Color == "Red");

        var query = context1.Items.Where(item =>
            items2.Any(item2 => item2.PainterId == item.PainterId));
    }
}

 >これにより、NotSupportedExceptionが発生します。
   メッセージ:「指定されたLINQ式には、さまざまなコンテキストに関連付けられているクエリへの参照が含まれています。」

 >この例外は、Entities2がEntities1に置き換えられた場合
   でも(両方のコンテキストが同じEDMXからのものである場合でも)、両方が同じ接続文字列を使用している場合でもスローされます。



一方、比較のために、これは機能し、単一のSQLステートメントになります。

using (var context1 = new Entities1())
{
    var items2 = context2.Items.Where(item2 => item2.Color == "Red");

    var query = context1.Items.Where(item =>
        items2.Any(item2 => item2.PainterId == item.PainterId));
}


制約:

私の意図は、デザイナーのサポート付きで2つのEDMXを使用することです。デザイナーを壊したり、データベースから更新するときに上書きされたりするような方法でEDMXをハッキングすることはありません。

EDMX#1はEDMX#2について知ることができません(ただし、#2は#1について知ることができます)。

結果を単一のSQLクエリに変換し、最初の部分からメモリに結果を読み取ってから、クエリの2番目の部分の入力としてデータベースに返すようにします。



関連していますが、私が探しているものではありません:

4

2 に答える 2

2

あなたはあなたの質問に答える方法であなたの要件を制約しました:いいえ、それは不可能です。最良かつ唯一の推奨される解決策は、大規模モデルの操作に関するADO.NETチームのブログの記事を参照する2番目のリンクにあります。

私はハックについて書きました(そして私は1つのプロジェクトでうまく使用しました)が、それは別の欠点があります-両方のEDMXに単一のコンテキストを使用する必要があります。それが機能したとしても、EFの他の多くの場所で使用されているコンテナ名を内部的に省略しているため、未踏の欠点がある可能性があるため、この方法を使用することはお勧めしません。

于 2011-05-25T07:27:43.473 に答える
0

2つのEDMXを3つ目のEDMXにマージし、それから両方の部分にアクセスする1つのObjectContextを作成する、別のハックが機能します。

3つのEDMXはすべて、同じ名前空間を使用する必要があります。

マージはプログラムで実行できます。マージの結果は次のようになります。EDMX、SSDL、CSDL、MSLファイル。リソースとして埋め込むためのT4およびその他のEDMX。

両方のソースEDMXにあるエンティティとアソシエーションは、まったく同じ定義(概念とマッピング)を持っている必要があります。

IDまたはその他の基準で結合して、両方のソースEDMXにまたがって実行されるマージされたEDMXのコンテキストでクエリを実行できるようになります。


結果の配線の詳細については、このリンクを参照してください。
個別のssdl + csdl + mslファイルからedmxなしでObjectContextを作成するにはどうすればよいですか?

于 2011-05-25T15:55:28.407 に答える