3

我試圖找出如何EF配置,以處理以下情況涉及一個家長和孩子多:防止額外的外鍵列到很多關係

public class Parent 
{ 
    public int ParentId {get; set;} 

    [ForeignKey("SpecialChildOneId")] 
    public virtual Child SpecialChildOne {get; set;} 
    public int? SpecialChildOneId {get; set;} 

    [ForeignKey("SpecialChildTwoId")] 
    public virtual Child SpecialChildTwo {get; set;} 
    public int? SpecialChildTwoId {get; set;} 

    public virtual ICollection<Child> Children {get; set;} 
} 

public class Child 
{ 
    public int ChildId {get; set;} 
    public int ParentId {get; set;} 
} 

生成的表我的父類看起來不錯。在我的子表上,雖然我添加了兩個額外的列,Parent_ParentId和Parent_ParentId1,並且ParentId上沒有設置外鍵。

如何強制ParentId成爲Child表上唯一的外鍵並防止添加其他外鍵?

回答

1

要解決此問題,你可以這樣做:

public class Child 
{ 
    public int ChildId {get; set;} 
    [ForeignKey("Parent")] 
    public int ParentId {get; set;} 
    public virtual Parent Parent{get;set;} 
} 

這種方式,其中涉及兒童的集合asociated與ParentId FK財產(這是創建​​FK關係的關係柱)。

現在,您可能認爲您有兩個一對一關係和一個一對多關係,但事實並非如此,您確實有三個一對多關係(前兩個關係具有單向導航)。如果您在使用流暢API配置這些關係,這將是這樣的:

modelBuilder.Entity<Parent>() 
       .HasOptional(p=> p.SpecialChildOne) 
       .WithMany() 
       .HasForeignKey(p=> p.SpecialChildOneId); 

    modelBuilder.Entity<Parent>() 
       .HasOptional(p=> p.SpecialChildTwo) 
       .WithMany() 
       .HasForeignKey(p=> p.SpecialChildTwoId); 

    modelBuilder.Entity<Child>() 
       .HasRequired(c=> c.Parent) 
       .WithMany(p=>p.Children) 
       .HasForeignKey(p=> p.ParentId); 

但是對於可能是你正在尋找的邏輯,這種模式應該工作。

+0

這幾乎是完美的。唯一的問題是創建一個Child對象並將其分配給parent.SpecialChildOne不會分配child.ParentId外鍵。我還必須將子項添加到要分配的外鍵的parent.Children集合中。 – 2015-04-07 14:08:34

+0

您好@Brian,當您設置「SpecialChildOne」導航。屬性,將要設置的FK屬性是「SpecialChildOneId」。 FK'ParentId'屬性屬於另一個關係,這就是直到您將子項添加到其父項中的集合(檢查最後的Fluent Api配置)之前,該屬性纔會更改其值。 – octavioccl 2015-04-07 14:46:30