2017-02-22 58 views
0

我想知道是否有人可以告訴我如何解決關於使用FluentAPI來映射幾個表的問題。映射不尋常的表關係

我有父表有我們的密鑰稱爲ID 然後有兩個字段idA & idB的子表。

父表中的主鍵鏈接到idA或idB,而不是兩者。

public Parent() 
    { 
     this.ChildA = new HashSet<Child>(); 
     this.ChildA = new HashSet<Child>(); 
    } 
    public virtual ICollection<Child> ChildA { get; set; } 
    public virtual ICollection<Child> ChildB{ get; set; } 
} 

public Child() 
    public virtual Parent parent { get; set; } 
} 

有很多我可以做的關係/表設計,因爲它是遺留的,不能改變。只需要瞭解用於解決此問題的正確FluentAPI。上面的例子,它是我所設想的將需要與類似的東西...

modelBuilder.Entity<Child>().HasRequired<Parent>(p => p.parent).WithMany(q => q.childs).HasForeignKey(r => r.idA); 
modelBuilder.Entity<Child>().HasRequired<Parent>(p => p.parent).WithMany(q => q.childs).HasForeignKey(r => r.idB); 

回答

0

我相信我能夠得到正確的映射,你正在尋找。我向POCO添加了導航屬性,允許Entity Framework知道如何在代碼中使用外鍵。

public class Child 
{ 
    public int Id { get; set; } 
    public virtual Parent ParentA { get; set; } 
    public virtual Parent ParentB { get; set; } 

    public Child() { } 
} 

對你現有的外鍵列映射這些導航屬性,我用FluentAPI Map方法。

modelBuilder.Entity<Child>().HasRequired<Parent>(p => p.ParentA).WithMany(q => q.ChildA).Map(m => m.MapKey("idA")).WillCascadeOnDelete(false); 
modelBuilder.Entity<Child>().HasRequired<Parent>(p => p.ParentB).WithMany(q => q.ChildB).Map(m => m.MapKey("idB")).WillCascadeOnDelete(false); 

有了這個,我已表明ParentA填充ChildA集合,ParentB填充ChildB集合。 Map方法是允許我映射到已經存在的FK的方法,並且我不必將POCO作爲屬性包含它們。

請注意,映射到表的每個POCO必須具有主鍵。你已經存在的子表是否有PK?否則,您可能會遇到一些麻煩。我建議閱讀這個SO貼子。 Entity Framework: table without primary key

+0

子表根本沒有PK。只是這個愚蠢的參考頭痛。謝謝,我會給這個好去處,非常感謝你的幫助。 –