Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 如何使用属性拥有同一实体类型的两个不同导航属性_Entity Framework_Foreign Key Relationship_Navigation Properties_Icollection - Fatal编程技术网

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
收集一个集合,这将非常适合