Entity framework 如何使用属性拥有同一实体类型的两个不同导航属性
我有两个实体:Entity framework 如何使用属性拥有同一实体类型的两个不同导航属性,entity-framework,foreign-key-relationship,navigation-properties,icollection,Entity Framework,Foreign Key Relationship,Navigation Properties,Icollection,我有两个实体: //主表/实体 [表(“职位”)] 公共阶级地位{ [键,列(“位置ID”)] public int PositionId{get;set;} [列(“职位名称”)] 公共字符串PositionName{get;set;} } //明细表/实体 [表(“从属位置”)] 公共类从属位置{ [键,列(“MASTERPOSID”,顺序=0)] 公共int MasterPosId{get;set;} [键,列(“SLAVEPOSID”,顺序=1)] 公共字符串SlavePosId{get
//主表/实体
[表(“职位”)]
公共阶级地位{
[键,列(“位置ID”)]
public int PositionId{get;set;}
[列(“职位名称”)]
公共字符串PositionName{get;set;}
}
//明细表/实体
[表(“从属位置”)]
公共类从属位置{
[键,列(“MASTERPOSID”,顺序=0)]
公共int MasterPosId{get;set;}
[键,列(“SLAVEPOSID”,顺序=1)]
公共字符串SlavePosId{get;set;}
[ForeignKey(“MasterPosId”)]
公共虚拟位置主位置{get;set;}
[外键(“SlavePosId”)]
公共虚拟位置SlavePosition{get;set;}
}
如您所见,在SlavePosition中,有两列显示此实体与Position的FK关系。这个布局效果很好。现在,我还需要将此集合属性添加到位置实体:
public virtual ICollection<SlavePosition> SlavePositions{get;set;}
然后获取PositionId=1的位置,如下所示:
[ForeignKey("SlavePositionId")]
public virtual ICollection<SlavePosition> SlavePositions { get; set; }
Position pos= dbContext.Positions.SingleOrDefault(x=>x.PositionId==1);
我没有得到任何错误,但是我得到了SlavePOsitions计数0,当它应该是5时,因为在数据库中,我在detail表中有5行。我可以通过运行以下代码来确认这一点:
IEnumerable<SlavePositions> slavePositions= dbcontext.SlavePositions.Where(x=>x.MasterPositionId==1);
IEnumerable slavePositions=dbcontext.slavePositions.Where(x=>x.MasterPositionId==1);
我有五个奴隶的位置
此集合属性的正确属性应该是什么?我终于找到了答案。我的错误在于引用的从属属性名称。我应该放置
MasterPositionId
,而不是SlavePositionId
这是有意义的,因为位置实体充当主表,并且在现实世界中外键关系是在明细表上设置的,而不是在主表上设置的。由于从属实体中没有与主实体中PK同名的属性,并且有多个属性具有指向同一主实体的Foreignkey,EF需要更多信息。通过向ICollection导航属性指定Foreignkey(“MasterPositionId”)
,我指示EF应将从属端点属性视为MasterPositionId。所以我改变了这个
[ForeignKey("SlavePositionId")]
public virtual ICollection<SlavePosition> SlavePositions { get; set; }
[ForeignKey(“SlavePositionId”)]
公共虚拟ICollection从属位置{get;set;}
对此
[ForeignKey("MasterPositionId")]
public virtual ICollection<SlavePosition> SlavePositions { get; set; }
[ForeignKey(“MasterPositionId”)]
公共虚拟ICollection从属位置{get;set;}
事实上,前者本身也没有错,只是不适合这种情况。但是如果我想为MasterPositions
收集一个集合,这将非常适合