1

我有两个实体具有相同的另一实体类型的两个不同的导航性能:如何使用属性

//The master table/entity 
[TABLE("POSITIONS")] 
public class Position{ 
    [Key,Column("POSITIONID")] 
    public int PositionId{get;set;} 
    [Column("POSITIONNAME")] 
    public string PositionName{get;set;} 
} 

//The detail table/entity 
[TABLE("SLAVE_POSITIONS")] 
public class SlavePosition{ 
    [Key,Column("MASTERPOSID",Order=0)] 
    public int MasterPosId{get;set;} 
    [KEY,Column("SLAVEPOSID",Order=1)] 
    public string SlavePosId{get;set;} 

    [ForeignKey("MasterPosId")] 
    public virtual Position MasterPosition {get;set;} 
    [ForeignKey("SlavePosId")] 
    public virtual Position SlavePosition {get;set;} 
} 

在SlavePosition,你可以看到,有两列在此实体是FK关系与位置。这种布局效果很好。现在,我还需要在此集合属性添加到位置的实体:

public virtual ICollection<SlavePosition> SlavePositions{get;set;} 

但很显然,EF会很困惑,我得到{"ORA-00904: \"Extent1\".\"Position_PositionId\": invalid identifier"}错误。 我若这样的:

[ForeignKey("SlavePositionId")] 
public virtual ICollection<SlavePosition> SlavePositions { get; set; } 

,然后取出用PositionId = 1这样的位置:

Position pos= dbContext.Positions.SingleOrDefault(x=>x.PositionId==1); 

我没有错误,但我得到SlavePOsitions数0,当它应该是5因为在数据库中,我在细节表中有5行。我可以通过运行下面的代码来确认这一点:

IEnumerable<SlavePositions> slavePositions= dbcontext.SlavePositions.Where(x=>x.MasterPositionId==1); 

我送五个SlavePosition。

该集合属性的正确属性是什么?

回答

2

我终于明白了。我的错误在于引用的依赖属性名称中。而不是SlavePositionId我应该把MasterPositionId

这很有意义,因为Position实体充当主表并且在现实世界中外键关系在细节表上设置,而不是在主表上设置。因为依赖实体中没有与主实体中的PK具有相同名称的属性,并且有多个属性具有到同一主实体的ForeignKey,所以EF需要更多信息。通过将指定ForeignKey("MasterPositionId")指定为ICollection导航属性,我指示EF依赖的终点属性应该被视为MasterPositionId。所以我改变了这个

[ForeignKey("SlavePositionId")] 
public virtual ICollection<SlavePosition> SlavePositions { get; set; } 

这个

[ForeignKey("MasterPositionId")] 
public virtual ICollection<SlavePosition> SlavePositions { get; set; } 

实际上前者本身并没有错或者,它只是不适合在这种情况下。但如果我想要收集MasterPositions,这将非常合适。