为什么我的实体框架模型只返回一个孩子,即使关系中有多个孩子?

时间:2013-12-20 17:16:50

标签: entity-framework

使用EntityFramework V6。

我有一个模型,当我在模型浏览器中查看时,我认为它看起来正确。

我的关系定义为1对多关系,在数据中我有很多孩子在ReferentialConstraint中定义了值。

但是,当我在代码中加载父对象的实例然后查询包含子元素的属性时,该属性只有一个元素,它似乎是一个随机的子元素。

可能导致这种情况的原因是什么?

该关联的xml如下所示:

    <Association Name="ABAssociation">
      <End Type="Model.A" Role="A" Multiplicity="1" />
      <End Type="Model.B" Role="B" Multiplicity="*" />
      <ReferentialConstraint>
        <Principal Role="A">
          <PropertyRef Name="Field1" />
          <PropertyRef Name="Field2" />
          <PropertyRef Name="Field3" />
          <PropertyRef Name="Field4" />
        </Principal>
        <Dependent Role="B">
          <PropertyRef Name="Field1" />
          <PropertyRef Name="Field2" />
          <PropertyRef Name="Field3" />
          <PropertyRef Name="Field4" />
        </Dependent>
      </ReferentialConstraint>
    </Association>

模型视图在A上显示导航属性,当我选择它时,它会突出显示B上的所有右侧字段。 B上没有导航属性,但我认为应该如此。

B有更多字段构成其主键,然后使用4,如果有所不同,但A有4个字段作为主键。

并且加载它的代码如下所示:

IRepository<A> aRepository = new ARepository<Entities>();
A a = ARepository.GetAll().FirstOrDefault(x => x.Field1 == 1 
                                            && x.Field2 == 6
                                            && x.Field3 == 151
                                            && x.Field4 == 4));
Console.WriteLine(a.Bs.Count); <-- always 1

我还能检查什么?或者我错过了什么?

修改

经过一番调查,我得到了更多的信息。

B有2个附加字段,其中一个是表的主键的一部分。在我的数据中,我在B的Field5中有所不同,我希望得到2行,其中Fields1-4相同且Field5不同。

如果我尝试选择这样的B实例:

IEnumerable<B> bs = BRepository.GetAll().Where(x => x.Field1 == 1
                                             && x.Field2 == 6
                                             && x.Field3 == 151
                                             && x.Field4 == 4).ToList();

然后我按照预期得到2个实例,但是对象Field5中的值是相同的。

为什么会发生这种情况?

1 个答案:

答案 0 :(得分:1)

从评论中可以明显看出,将谓词x => x.Field1 == 1 ...直接应用于Bs会导致相同的B对象被实现。这通常表明EF上下文中的主键与数据库中的PK相比具有更少的判别性。

我不知道在集合导航属性中,这会导致集合的项目数量少于(但显然是唯一的)项目,因此对我来说这是一个针对主键问题的新​​诊断。