1

Product と Order の 2 つのエンティティと、それらの間の 1 つの多対多の関連付けを持つ単純な DbContext モデルがあります。製品インスタンスに関連付けられた特定の注文を明示的に読み込もうとしています。したがって、製品インスタンスのすべての注文を明示的にロードすることから始めました。

context.Entry(product).Collection(x=>x.Orders).Load();

product.Orders には、関連するすべての注文が含まれるようになりました。ここまでは順調ですね。ここで、次のように「.Query()」メソッドを使用して、より具体的なクエリを作成したいと思います。

context.Entry(product).Collection(x=>x.Orders).Query().Load();

驚いたことに、product.Orders は空になりました!

ドキュメントによると、Query() メソッドは「データベースからこのコレクションをロードするために使用されるクエリ」を返す必要があります。ObjectQuery を手動で実行すると、期待どおりの結果が得られます。

私は何か間違ったことをしていますか、これは EF のバグですか?

よろしくお願いします。

敬具、メリジン

4

1 に答える 1

1

違いは、2 番目のステートメント ( with )は、 collectionQuery().Load()ではなく、コンテキストにのみ注文をロードすることです。実行されるのは単なるクエリであり、入力する必要があるコレクションを認識していません。

リストすることで確認できますcontext.Orders.Local。の後に、Query().Load()に属する注文が含まれproductます。

product.Orders後で遅延読み込みを許可すると、同じクエリが実行されていることがわかりますが、今度はコレクションにデータを入力します。

編集
頭をすっきりさせ、多対多、1対多、怠惰/非怠惰を区別した後、問題を完全に再現できました。m:m ナビゲーション プロパティはによってロードされません.Query().Load()が、1:n ナビゲーション プロパティはロードされます。ただし、どちらのLocal場合もコレクションは読み込まれます。

では、大漁!

于 2012-11-23T20:41:54.640 に答える