2016-10-01 68 views
0

這裏有一個有趣的位,我以前沒有遇到過。我們使用註釋手動創建在EF6一個多一對多的關係:不再贅述EF6中的多對多實體

public class User 
{ 
    public int Id { get; set; } 
} 

public class School 
{ 
    public int Id { get; set; } 
} 

public class UserSchool 
{ 
    [Key] 
    [Column(Order = 1)] 
    public int UserId { get; set; } 

    [Key] 
    [Column(Order = 2)] 
    public int SchoolId { get; set; } 

    [Required] 
    public virtual User User { get; set; } 

    [Required] 
    public virtual School School { get; set; } 
} 

(其它附加的屬性 - 我只想說,我們對結表的附加屬性,因此爲什麼我們已經創造了它明確)

所以這工作得很好 - 我們可以使用流暢的API來映射覆雜的鍵,它是無關緊要的。基本上我們已經通過交匯點將兩個標準表加入了多對多。優勝者。

現在,我們需要加入表(UserSchool)到另一個表,也可作爲許多一對多:

public class IPAddress 
{ 
    public int Id { get; set; } 

    public string IPAddress { get; set; } 
} 

public class UserSchoolIPAddress 
{ 
    ?? what to put in here 

    public virtual UserSchool UserSchool { get; set; } 

    public virtual IPAddress IPAddress { get; set; } 
} 

我都試過了一口流利的API映射通過命名約定和註釋來指定ID屬性:流暢的API映射只是失敗,因爲我認爲它不喜歡使用導航實體的屬性;帶註釋的ID綁定僅在表模式中第二次複製了UserSchool屬性,導致我們出現同步問題。

那麼,有沒有人遇到過這種情況,並找到了解決方案?

回答

0

好吧,原來我是個白癡。看起來框架實際上會處理我的場景,但是我錯誤地配置了屬性類型,所以出現了不匹配,因此EF試圖複製新的屬性。因此

的多對接線表的完成的定義是,如下所示:

public class UserSchoolIPAddress 
{ 
    [Key] 
    [Column(Order = 1)] 
    public int UserSchoolUserId { get; set; } 

    [Key] 
    [Column(Order = 2)] 
    public int UserSchoolSchoolId { get; set; } //<-- I had this set to a string for some reason, which broke everything 

    [Key] 
    [Column(Order = 3)] 
    public int IPAddress IPAddressId { get; set; } 

    public virtual UserSchool UserSchool { get; set; } 

    public virtual IPAddress IPAddress { get; set; } 
} 

因此,這將正確地創建使用FK的第二結表,以「多」端(在這種情況下IPAddress)和兩個FK到「結」端(UserSchool),並且在這個「超結」上將所有三個FK一起組合成一個複合PK。 EF做得好!

0

如果您以正確的方式配置您的實體,您不需要聯結表,EF會爲您創建它。

在你的情況下,你有一個用戶可以有很多學校和一個可以有很多用戶的學校。如果你創建這個模型(並通過流利的apis配置它),EF將爲你創建UserSchool表,並且你不需要管理它(EF會爲你處理)。

關於IPAddress如果我理解你的模型,IPAddress由單個用戶在一所學校使用。你的模型,有一些導航屬性可能是這樣的。

public class User 
{ 
    public int Id { get; set; } 
    public virtual ICollection<School> Schools {get; set;} 
    public virtual ICollection<IpAddress> IpAddresses {get; set;} 
} 

public class School 
{ 
    public int Id { get; set; } 
    public virtual ICollection<User> Users {get; set;} 
    public virtual ICollection<IpAddress> IpAddresses {get; set;} 
} 

public class IpAddress 
{ 
    public string Id { get; set; } 
    public virtual User User {get; set;} 
    public virtual School School {get; set;} 
} 
+0

正如我在我原來的問題提到的,我們實際存儲的數據對象作爲結映射的性能 - 例如'UserSchool'對象實際上有連接其它外鍵和權限級別。所以我們需要手動配置它們。 – Katstevens