2016-05-23 74 views
1

這是Code-First。EF6如何映射這個零或一對一關係

什麼是這種關係的正確流利或數據註釋?

獲取EF映射錯誤: 無法確定類型「Model.SchoolInfo」和「Model.School」之間關聯的主體端。該關聯的主要目的必須使用關係流暢API或數據註釋來顯式配置。

如果我添加

modelBuilder.Entity<School>().HasOptional(s => s.SchoolInfo).WithRequired(ss => ss.School); 

我得到這個錯誤:模型生成過程中檢測到 一個或多個驗證錯誤:School_SchoolInfo_Target:多重不是在關係中的作用「School_SchoolInfo_Target「School_SchoolInfo」有效。因爲「依賴角色」屬性不是關鍵屬性,所以「依賴角色」的多重性的上界必須爲「*」。

SQL表

table School 
(
    int SchoolId not null PK 
) 

table SchoolInfo 
(
    int SchoolInfoId not null PK IDENTITY 
    int SchoolId not null FK UNIQUE 
) 

模型

class School 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    int schoolId; 

    virtual SchoolInfo SchoolInfo; 
} 

class SchoolInfo 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    int schoolInfoId; 

    int schoolId; 

    virtual School School 
} 
+0

爲什麼你問同樣的問題[兩次](http://stackoverflow.com/questions/37349886/EF-是映射到最錯誤的按鍵上的實體)? –

回答

3

如果你想實現1:1映射,這是表看起來應該像:

Schools

SchoolInfoes

而且你的實體類在這種情況下是這樣的:

public class School 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int SchoolId { get; set; } 

    public virtual SchoolInfo SchoolInfo { get; set; } 
} 

public class SchoolInfo 
{ 
    [ForeignKey("School")] 
    public int SchoolInfoId { get; set; } 

    public virtual School School { get; set; } 
} 

您當前的表格結構建議1:M映射,並以實體類映射到它,你需要做的細微變化:

public class School 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int SchoolId; 

    public virtual IList<SchoolInfo> SchoolInfoes { get; set; } 
} 

public class SchoolInfo 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int SchoolInfoId { get; set; } 

    public int SchoolId { get; set; } 

    public virtual School School { get; set; } 
} 
+0

我需要在SchoolInfo模型上保留SchoolId和SchoolInfoId – user3953989

+0

@ user3953989如果您將SchoolId保存在SchoolInfo類中,則您正在設置1:M關係。這是你的目標嗎?如果您設置爲1:1,那麼SchoolInfoId中的SchoolInfoId與SchoolId中的SchoolId具有相同的值。 –

+0

我已經添加了一個UNIQUE約束到SchoolInfo表格SchoolId列,這應該使它在數據庫方面是一對一的。不幸的是,我會重構大量的代碼,以改變爲我目前無法完成的正確的一對一編碼。 – user3953989

0

您可以考慮在審查您的實體關係數據模型。嘗試刪除SchoolInfoId字段(您實際上並不需要它),並使用學校ID FK作爲PK。這將使您的數據模型保持一致。

+0

我不能在這種情況下 – user3953989