2015-09-17 144 views
0

我有2個對象 - 父母和子女之間的關係多對多,問題是1父母可以有2個相同的孩子,但EF只保存這種關係1時間。實體框架允許在多對多關係中重複

我發現只有2個工作方案:

  1. 添加count列到表並手工填寫它
  2. 沒有使用多到很多,但它分割成一個一對多和多對多一個 但我不喜歡這個解決方案,因爲我希望可以有一些更簡單的解決方案。

請問您能幫我嗎?

編輯:聯接表 示例:

1-1

1-1

1-2

1-3

2-3

代碼: model

public class Item 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int id { get; set; } 

    public virtual ICollection<Item> childs { get; set; } 
    public virtual ICollection<Item> parents { get; set; } 
} 

DB上下文

modelBuilder.Entity<Item>(). 
HasMany(i => i.childs). 
WithMany(i2 => i2.parents). 
Map(
m => 
{ 
m.MapLeftKey("parentId"); 
m.MapRightKey("childId"); 
m.ToTable("itemRelationship"); 
}); 
+0

如果我理解正確,父母可以有多個孩子和孩子將有父母。然後它可以在1-N關係中完成。如果我的理解錯誤,請糾正我。 –

+0

發佈您的代碼的外觀,以及您使用哪種EF配置方法獲取更多幫助。 – Tim

+0

'1父母可以有2個相同的孩子' - 這很混亂,孩子們如何被認爲是同一個***?沒有更多的解釋,我認爲他們實際上是一個孩子,當你說他們是相同的。 – Hopeless

回答

1

關係數據庫是約。一個集合是一個明確的實體集合。然而,你的路口表,你想象的方式,是一個。這違反了關係理論的基礎。像往常一樣,一次違規會導致其他違規行爲。沒有一個唯一的主鍵,一個身份,是下一個。不能通過外鍵引用這些聯結記錄,如果你想要的話,是另一個。

所以只是不要這樣做。

我認爲這裏的錯誤是你想用你創建的行數來表達事實「AnB」。但是這個數字是該協會的一個屬性。

我們來看一個例子:Articles and Words。

您可以通過純多對多關聯來表示ArticleWord之間的關係。該協會表示:Article包含這些Word s。觀看指示代詞(這是這些)。他們意味着身份。每篇文章將有一個實例,數據庫中每個單詞的一個實例。

如果要存儲單詞出現的次數,則必須將此編號作爲屬性添加到關聯中。一個事實從來不會被許多行建模。單行描述事實「此Article具有n出現那Word」。在實體框架中,這意味着該關聯成爲類模型中的類,例如ArticleWord。該關聯的多重性爲Article 1-n ArticleWord n-1 Word

0

一個解決辦法是首先定義該關係表。該表的主鍵將是它包含了2個外鍵的組合,這將允許複合鍵的樣子:

1-1,

2-1,

2 -2

但不是:

1-1

1-1

1-2

2-1

+1

是的,我的數據庫不包含重複,但我想我的數據庫遏制它 – Eleer

+0

好的,目標是讓他們? –

+0

在這種情況下,不要聲明任何主鍵,而只是將它們聲明爲「唯一」,它將解決所有問題 –