1

4 つのテーブルを持つデータベースがあります。TableA と TableB はメイン テーブルで、TableC は多対多リレーションシップのテーブルです。

  • TableA(IDTableA, 名前...)
  • TableB(IDTableB, 名前...)
  • TableC(IDTableA, IDTableB)

これにより、3 つのエンティティが作成されます。エンティティ A にはエンティティ C の ICollection があり、エンティティ C にはエンティティ B のコレクションがあるため、関連するエンティティを取得しようとすると、次のようにします。

myContext.EntityA.Include(a=>a.EntityB.Select(b=>b.EntityC));

しかし、コレクションがnullであることを示すこのスローと例外。

したがって、多対多の関係のテーブルがある場合に熱心な読み込みが可能かどうかを知りたいです。

ありがとう。

4

2 に答える 2

2

これが必要だと思います:

var q = myContext.EntityC.Include("EntityA").Include("EntityB").ToList();

A の B が必要な場合:

var aId; // = something...;

var bs = from c in q
                     where c.EntityAId == aId
                     select c.EntityBId;

As of a B が必要な場合は、その逆も同様です。

var bId; // = something...;

var eas = from c in q
                     where c.EntityBId == bId
                     select c.EntityAId;
于 2013-08-03T10:33:40.480 に答える
1

Entity Framework の多対多の関連付けでは、次の 2 つの実装から選択できます。

  • ジャンクション テーブル (C) は概念モデル (クラス モデル) の一部であり、関連付けはA—C—B(1—n—1) です。A は B のコレクションを持つことはできません。
  • ジャンクション テーブルは概念モデルの一部ではありませんが、Entity Framework はそれを透過的に使用して関連付けA—B(n-m) を維持します。A には B のコレクションがあり、B には As のコレクションがあります。これは、テーブル C に A および B への 2 つの FK 列のみが含まれている場合にのみ可能です。

したがって、両方を持つことはできません。

C(どうやら) 最初のオプションを選択したため、次のように、常に他のエンティティを照会する必要があります。

from a in context.As
select new { a, Bs = a.Cs.Select(c => c.B) }

また

from a in As.Include(a1 => a1.Cs.Select(c => c.B))
于 2013-08-03T21:21:32.443 に答える