1

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

  • 表A(IDTableA,名称...)
  • 表B(IDTableB,名称...)
  • 表C(IDTableA,IDTableB)

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

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

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

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

谢谢。

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;

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

var bId; // = something...;

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

通过实体框架中的多对多关联,您可以在两种实现之间进行选择:

  • 联结表 (C) 是概念模型(类模型)的一部分,关联为A—C—B(1-n-1)。A 不能有 B 的集合。
  • 联结表不是概念模型的一部分,但 Entity Framework 透明地使用它来维持关联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))
于 2013-08-03T21:21:32.443 回答