0

EntityFramework4.2を使用してオブジェクトグラフを作成したいと思います。

現在、ナビゲーションプロパティにICollectionを使用しているPOCOエンティティがあります。EntityCollectionやEF固有のものは使用しないようにします。

Includeを過度に使用することによって引き起こされる大規模な結合を避けたい。オブジェクトを指定して、そのナビゲーションプロパティにデータを入力し、別のデータベースクエリを作成します。

ICollectionに直接データを入力する方法はありますか?現在、私はこの問題を回避していますが、それは本当に苦痛です。

// grab the user, brand users and brands
User user = entities.Users
                    .Include(item => item.BrandUsers.Select(brandUser => brandUser.Brand))
                    .Where(item => item.Name == userName)
                    .SingleOrDefault();
// grab the pending share grants and brands
entities.Users
        .Include(item => item.ToShareGrants.Select(shareGrant => shareGrant.Brand))
        .Where(item => item.Id == user.Id)
        .Load();
return user;

このアプローチについて私が気に入らないことの1つは、最上位オブジェクトを再クエリしていることです。これを行わないと、オブジェクトが返されないときにナビゲーションプロパティが設定されません(NULLのままになります)。たとえば、次のコードは、結果が返された場合にのみ機能します。

entities.ShareGrants
        .Include(item => item.Brand)
        .Where(item => item.ToUserId == user.Id)
        .Load();

これらのタイプの関係を構築するためのエンティティフレームワークに、私が知らなかった方法があるかどうかに興味がありました。ナビゲーションプロパティを段階的に入力する簡単な方法を知っている人がいれば、コードサンプルをいただければ幸いです。

4

3 に答える 3

0

現在のクエリの遅延読み込みをオフにしてみてください。これを using ブロックに入れるだけでかまいません。

entities.ContextOptions.LazyLoadingEnabled = false;
于 2012-01-26T22:39:43.363 に答える
0

この質問に対する簡単な答えは、EF4 は私が必要としていた機能を直接サポートしていなかったということです。大規模な結合を防ぎ、結果をデータベースへの複数の呼び出しに分割するには、最上位のエンティティをデータベースから再度ダウンロードする必要があります。これは、結果セットの左端の列が、レコードごとに繰り返されるエンティティの列になることを意味します。

于 2012-07-31T23:55:48.533 に答える
0

あなたの質問はあまり明確ではありません。Include同じクエリで複数の を使用しない理由

User user = entities.Users
      .Include(item => item.BrandUsers.Select(brandUser => brandUser.Brand))
      .Include(item => item.ToShareGrants.Select(shareGrant => shareGrant.Brand))
      .Where(item => item.Name == userName)
      .SingleOrDefault();
于 2012-01-27T00:27:20.550 に答える