2015-05-14 54 views
3

我無法在EF6中先使用代碼連接多對多關係,然後再創建一個傳遞關聯。EF6多對多非關鍵列

有三個類:Person,Tag和Passing。

每個人都有一個可選的圍脖。

每個標籤都有一個可選的圍兜,不是唯一的。

每次通過都有一個必需的TagId。

我想通過獲取所有標籤與同一個Bib,然後獲取與這些標籤中的每一個關聯的所有Passings,來訪問與某人關聯的所有通行證。

我試過在我的DBContext類中使用DBModelBuilder,但無法使它正常工作,而EF6似乎試圖生成一箇中間表反正,這似乎是不必要的。

public class Person 
{ 
    [Key] 
    public int PersonId { get; set; } 
    ... 
    public string Bib { get; set; } 
    public virtual ICollection<Tag> Tags { get; set; } 
    public virtual ICollection<Passing> Passings 
} 

public class Tag 
{ 
    [Key] 
    public string TagId { get; set; } 
    public string Bib { get; set; } 
    public virtual ICollection<Passing> Passings { get; set; } 
    public virtual Person Person { get; set; } 
} 

public class Passing 
{ 
    [Key] 
    public int PassingId { get; set; } 
    ... 
    public string TagId { get; set; } 
    public virtual Tag Tag { get; set; } 
} 
+0

我在這裏看不到多對多的關係。 EF建立什麼中間表?另外,我不明白爲什麼「Bib」上的信息與此相關。 –

+0

圍兜是該協會的來源。 Tag上的Person屬性應該獲得具有相同bib(或null)的Person,並且Person上的Passings屬性應該獲得具有相同bib的標籤列表。這可能是EF不可能的,但我希望它是這樣,所以我不需要一個混亂的解決方法。 – Nick

回答

1

IT是必要的,當你有一個*至*多重成表,它全自動創建鏈接這些另一個表,elseway你不能把你的表

之一foraign關鍵的無限和可變數量
+1

這很有道理。 – Nick

1

實體框架使用navigation properties來表示數據庫關係。如果你不想要一個額外的表,那麼你在這裏不是一個數據庫關係,因爲不涉及密鑰。

您應該能夠使用某種功能(或擴展功能)來得到你想要的東西:

IQueryable<Passing> PersonPassings(YourContext db, Person p) 
{ 
    return db.Passings.Where(pa => pa.Tag.Bib == p.Bib); 
} 

在另一方面,如果你想創建一個恰當的關係,你將需要一箇中間Bibs表連接PersonTag