使用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中的值是相同的。
为什么会发生这种情况?
答案 0 :(得分:1)
从评论中可以明显看出,将谓词x => x.Field1 == 1 ...
直接应用于Bs
会导致相同的B对象被实现。这通常表明EF上下文中的主键与数据库中的PK相比具有更少的判别性。
我不知道在集合导航属性中,这会导致集合的项目数量少于(但显然是唯一的)项目,因此对我来说这是一个针对主键问题的新诊断。