3

私はこの記事をフォローしていますhttp://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities .aspx

具体的には、「関連エンティティを明示的に読み込むときにフィルターを適用する」というタイトルのセクション。

私は次のようなことをする必要があります:

db.Configuration.LazyLoadingEnabled = false;
var class = db.Classes.Find(1);
db.Entry(class).Collection(c => c.Students).Query().Where(s => s.grade > 2.0).Load();

これをステップ実行して SQL プロファイラーを見ると、クラスをロードするクエリが表示されます。その後、Students をロードするクエリが表示されますが、class.Students は入力されず、null のままです。ただし、学生のクエリを SQL プロファイラーからコピーして自分で実行すると、適切な学生が返されます。Entity Framework は学生のクエリを実行して適切な結果を返しているようですが、それらをクラス オブジェクトにアタッチしていないようです。

これを回避する方法はありますが、手順を間違えたのか、.Load() を適切に使用していないのか疑問に思っています。

4

1 に答える 1

2

と の関係が多対多のClass関係である場合、表示されている動作は予想どおりです (混乱はしますが、認めます)。まず、インテリセンスがメソッドについて言っていることを読むと...StudentLoad

System.Data.Entity.DbSet、System.Data.Objects.ObjectSet、System.Data.Objects.ObjectQuery などのサーバー クエリの場合、クエリの結果が関連付けられたシステムに読み込まれるように、クエリを列挙します。 .Data.Entity.DbContext、System.Data.Objects.ObjectContext、またはクライアント上のその他のキャッシュ。これは、ToList を呼び出してから、実際にリストを作成するオーバーヘッドなしでリストを破棄することと同じです。

...クエリを実行するエンティティのナビゲーション コレクションにデータが入力されるとは言いません。結果がコンテキストに読み込まれるだけです。

呼び出し時に1対多の関係の場合にナビゲーション コレクションが生成されるLoadのは、実際にはこのメソッドの結果ではなく、関係 span または fix-upと呼ばれるコンテキストの後続の処理の結果であり、この処理は行われません。多対多の関係に。

この質問と回答に詳細があります: EF 4.1 フィルタリングされた子コレクションの読み込みが多対多で機能しない

ToList()真髄は、多対多のリレーションシップの場合、代わりにLoad()次を使用して、ナビゲーション コレクションを直接設定する必要があることです。

var class1 = db.Classes.Find(1);
class1.Students = db.Entry(class1).Collection(c => c.Students).Query()
    .Where(s => s.grade > 2.0).ToList();

これにより、生徒がコンテキストclass1読み込まれ、同時にナビゲーション コレクションが読み込まれます。

于 2012-07-24T00:10:33.160 に答える