2015-12-11 64 views
1

這裏的第一個問題,即使我現在已經瀏覽堆棧多年了。強制HasMany()使用關聯表

我有一個實體框架和遷移的問題,更準確地說是映射。 我很清楚所有關於多到多,一到多,關聯表之類的東西,但我還沒有來翻過這一特定問題的解決方案的問題:

這些都是我的POCO:

public class A 
{ 
    public virtual long Id {get; set;} 

    public virtual ICollection<B> B {get; set;} 
} 

public class B 
{ 
    public virtual long Id {get; set;} 

    // Not relevant stuff ... 
} 

我想迫使映射給我一個關聯表,東西,可能是這樣的:

----------- ----------- ----------- 
| TABLE A | | TABLE AB| | TABLE B | 
----------- ----------- ----------- 
| ID  | | FK_A_ID | | ID  | 
----------- | FK_B_ID | ----------- 
       ----------- 

我的第一反應是使用這種映射類型:

modelBuilder.Entity<A>() 
       .HasMany(x => x.B) 
       .WithMany() 
       .Map(x => 
       { 
        x.ToTable("AB"); 
        x.MapLeftKey("Id"); 
        x.MapRightKey("Id"); 
       }); 

不幸的是,這並沒有給我所需的數據庫映射,因爲它正在引用B.Id.的表A中創建一個外鍵。另外,我不想在B班有A的房產。有關信息,目標數據庫是SqlServer。

有沒有適當的方法來做到這一點?

注意:我不是英語母語的人,如果我犯了錯誤,請原諒我。

+0

請參見[56,「問題‘’包括在他們的頭銜?」標籤(http://meta.stackexchange.com/questions/19190/應該提問題包括標籤在他們的標題),其中共識是「不,他們應該不」! –

回答

0

不知道你爲什麼試圖實現這一點,但是,這是可能的。

是排在我腦海中hypotesis的是,你不能編輯既不AB,但你想要的很多很多的關係......所以這是一個解決辦法:

只需創建一個類AB既ID的AB然後定義按鍵與裝飾鑑別

class AB { 
    virtual public A ALink {get; set;} 
    [Key, Column(Order = 0)] 
    public int ALinkId {get; set;} 

    virtual public B BLink {get; set;} 
    [Key, Column(Order = 1)] 
    public it BLinkId {get; set;} 
} 
+0

upvoted這個原因,是的,你的解決方案的工作,但是,整點不是手代碼另一類。就像在多對多關聯中一樣,關聯表爲您設置,確保級聯刪除和內容。 – OgaFuuu

+0

這是一個多對多的關係。 如果您只是在B類中創建A的列表,實體框架會自動爲您生成中間件表。 不需要配置任何東西 –

+0

正如我所看到的,沒有更多的答案可以找到更好的解決方案嗎? ORM的任務是提供一些標準,以semplify與數據庫不工作在你的地方... –