2016-12-06 101 views
0

我想獲得多個「單位」有一組分配的「UnitInfo」,但首先使用代碼時,我得到EF以下消息:多0..1關係到同一個表實體框架代碼首先

在模型生成期間檢測到一個或多個驗證錯誤: Unit_UnitInfo_Source::多元性在關係「Unit_UnitInfo」中的角色「Unit_UnitInfo_Source」中無效。由於依賴角色屬性不是關鍵屬性,所以從屬角色的多重性的上限必須是''。 SubUnit_UnitInfo_Source:多重不是在關係中的作用「SubUnit_UnitInfo_Source「SubUnit_UnitInfo」有效。因爲「依賴角色」屬性不是關鍵屬性,所以「從屬角色」的多重性上限必須爲「」。

我使用的類看起來是這樣的:

public class Unit 
{ 
    public int UnitId { get; set; } 
    public string Name { get; set; } 
    public List<SubUnit> SubUnits { get; set; } 

    [ForeignKey("UnitInfoId")] 
    public UnitInfo UnitInfo { get; set; } 
} 

public class SubUnit 
{ 
    public int SubUnitId { get; set; } 
    public string Name { get; set; } 

    [ForeignKey("UnitInfoId")] 
    public UnitInfo UnitInfo { get; set; } 
} 

public class UnitInfo 
{ 
    public int UnitInfoId { get; set; } 
    public string Function { get; set; } 
    public string Location { get; set; } 
} 

我敢肯定,這是一個簡單的錯誤,我只是不能想出辦法來的。

我在做什麼錯?

+0

你可以自由地記住我的解決方案的答案,如果它幫助解決你的問題,還是不要猶豫,問它更多的問題。 –

回答

0

[ForeignKey()]屬性應該指代的外鍵,或在同一類的導航屬性。因此,UnitInfoId應該是您指定導航屬性和[ForeignKey()]屬性的類的成員。

導航性能應該是爲了讓EF爲懶加載創建代理類的虛擬。如果你不使用流利的api,你應該爲主鍵指定[Key]屬性。此外,參考集合應聲明爲虛擬ICollection成員。你所需要的架構可以聲明如下:

public class Unit 
{ 
    public Unit() 
    { 
     SubUnits = new HashSet<SubUnit>(); 
    } 

    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int UnitId { get; set; } 
    public string Name { get; set; } 

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<SubUnit> SubUnits { get; set; } 

    public int UnitInfoId { get; set; } 

    [ForeignKey("UnitInfoId")] 
    public virtual UnitInfo UnitInfo { get; set; } 
} 

public class SubUnit 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int SubUnitId { get; set; } 
    public int UnitId { get; set; } 
    public string Name { get; set; } 

    [ForeignKey("UnitId")] 
    public virtual Unit ParentUnit { get; set; } 

    public int UnitInfoId { get; set; } 
    [ForeignKey("UnitInfoId")] 
    public UnitInfo UnitInfo { get; set; } 
} 

public class UnitInfo 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int UnitInfoId { get; set; } 
    public string Function { get; set; } 
    public string Location { get; set; } 
} 

不過,我會建議使用繼承,因爲單位和亞單位共享相同的結構。你可以閱讀更多關於EF代碼第一HERE