2014-01-06 43 views
2

這裏是我的模型的抽象的概念:正確映射(難道我聞到了很多很多?)

public class Apple 
{  
    public int AppleID {get;set;} 
    public virtual IEnumerable<Banana> Bananas {get;set;} 
} 

public class Banana 
{  
    public int BananaID {get;set;} 
    public int AppleID {get;set;} 
    public virtual Apple Apple {get;set;}  
} 

現在,讓我們說,即使一個蘋果也有不少香蕉。

如果一個香蕉會有第二個不同自己的蘋果?

我錯過了什麼。 (小於4小時睡眠昨晚)

我不能添加修改香蕉看起來像這樣:

public class Banana 
{  
    public int BananaID {get;set;} 
    public int AppleID {get;set;} 
    public virtual Apple Apple {get;set;}  
    public int AnotherAppleID {get;set;} 
    public virtual Apple AnotherApple {get;set;} 
} 

爲了澄清 「這是有點兒看起來像一個父/子關係,每個孩子都有正好一個母親和一個父親,但父母可能有很多孩子「 - PSWG

+0

你想要一個多對多的關係嗎? '公共虛擬列表蘋果{get; set;}'或者你只是想要兩種不同的一對多關係? '公共虛擬Apple OtherApple {get; set;}' –

+0

@ p.s.w.g對於錯字 – Pinch

+0

@ p.s.w.g其他Apple – Pinch

回答

3

那麼,我現在只能想到兩種解決方案。第一個需要兩種不同的關係。我要去所以它出來一點更清晰地重命名你的類:

public class Parent 
{  
    [Key] 
    public int ParentID {get;set;} 

    [InverseProperty("Father")] 
    public virtual ICollection<Child> FatherOf {get;set;} 

    [InverseProperty("Mother")] 
    public virtual ICollection<Child> MotherOf {get;set;} 
} 

public class Child 
{  
    [Key] 
    public int ChildID {get;set;} 

    [ForeignKey("Father")] 
    public int FatherID {get;set;} 
    public virtual Parent Father {get;set;} 

    [ForeignKey("Mother")] 
    public int MotherID {get;set;} 
    public virtual Parent Mother {get;set;} 
} 

不幸的是,這意味着你必須要看到,如果父母有一個特定的每次做兩個不同的檢查兒童。另外,如果你想確保一個child.Mother != child.Father,你必須寫一個自定義的entity validation例程。當然,你可以把它表示這兩套,這樣的特性:

[NotMapped] 
public IEnumerable<Child> Children 
{ 
    get { return this.FatherOf.Concat(this.MotherOf); } 
} 

但你將無法在LINQ到實體查詢中使用此。

替代,這可能是從長遠來看更簡單的是有一個傳統的許多一對多的關係:

public class Parent 
{  
    public int ParentID {get;set;} 
    public virtual ICollection<Child> Children {get;set;} 
} 

public class Child 
{  
    public int ChildID {get;set;} 
    public virtual ICollection<Parent> Parents {get;set;} 
} 

而寫信的自定義實體的驗證程序,以確保Parents.Count() == 2。這裏唯一的問題是你不能在Linq-to-Entities中單獨提及父母(至少不太容易)。但是,如上所述,一旦將其加載到內存中,您就可以使未映射的屬性爲每個父代分別提供更方便的訪問。

警告講師:我沒有測試過上述代碼,並且完全有可能我在這裏或那裏缺少一個必要的屬性。

+0

非常感謝這是一個了不起的和翔實的答案! – Pinch