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,這將非常合適。