如何在多对多的关系中获得热切的加载?

时间:2013-08-03 10:12:16

标签: c#-4.0 entity-framework-5 eager-loading

我有一个包含四个表的数据库。 TableA和TableB是主表,TableC是多对多关系的表。

  • TableA(IDTableA,名称......)
  • TableB(IDTableB,Name ...)
  • TableC(IDTableA,IDTableB)

这创建了三个实体,EntityA有一个实体C的ICollection,而实体C有一个EntitiesB的集合,所以当我尝试获取相关的实体时,我这样做:

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

但是这个抛出和异常表明集合是空的。

所以我想知道当有一个多表关系的表时,是否可以进行急切的加载。

感谢。

2 个答案:

答案 0 :(得分: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;

如果你需要从B开始,反之亦然:

var bId; // = something...;

var eas = from c in q
                     where c.EntityBId == bId
                     select c.EntityAId;

答案 1 :(得分:1)

在Entity Framework中有多对多的关联,您可以在两种实现之间进行选择:

  • 联结表(C)是概念模型(类模型)的一部分,关联是A—C—B(1-n-1)。 A不能有B的集合。
  • 联结表不是概念模型的一部分,但实体框架透明地使用它来维持关联A—B(n-m)。 A有一个B的集合,B有一个As的集合。仅当表C仅包含A和B的两个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))