2010-01-22 48 views
0

我有2個實體是這樣的:流利,NHibernate的:如何映射一個一對多的關係到3個表(很多到多,還挺)

class A 
{ 
    int id { get; set; } 
    string Name { get; set; } 
} 

class B 
{ 
    int id { get; set; } 
    A RefToA { get; set; } 
    string Name { get; set; } 
} 

我該如何映射這2班所以,我將有3個表是這樣的:

  • 表阿2列:2列的ID和名稱

  • 表B:ID和名稱

  • 表AB 2列:援助和出價

+0

如果您想要一對多,爲什麼需要參考表格(AB)? – 2010-02-01 12:11:53

+0

,因爲大多數情況下,幾乎總是由一對多創建的FK列將爲空 – Omu 2010-02-01 12:15:04

+0

那麼爲什麼不具有以下列'AId REFERENCES NULL'? – 2010-02-01 13:46:56

回答

2

如果因爲你想引用可爲空我明白這是正確的,你要創建一個參考表的單個實例。如果是這樣的話,你不需要一個ref表。只需將表b中的FK設置爲​​空即可。然後你可以將它映射爲一個簡單的參考。然後,你將有一個像這樣的表:

  • 表格中的2列:ID和名稱
  • 表B中有2列:ID,姓名和 援助(可爲空)

,你可以映射這樣的:

public class AMap : ClassMap<A> 
{ 
    public AMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name); 
    } 
} 

public class BMap : ClassMap<B> 
{ 
    public BMap() 
    { 
    Id(x => x.Id); 
    Map(x => x.Name); 
    References(x => x.RefToA); 
    } 
} 

更新

沒有辦法在nhibernate中映射這個你想要的(並且沒有其他的orm)。原因很簡單:它違反了很多規則,並且沒有理由這樣做。這樣做的正確方法是在表b中有一個可空的fk引用。這就是你在sql數據庫中表示引用的方式。當你的意思是一對多時,使用多對多的設計是一個糟糕的設計,而且以後肯定會給你帶來麻煩。

+0

它不是因爲它是可空的,這是因爲我不希望它出現在該表中 – Omu 2010-02-01 12:23:37

+0

我看不到爲什麼?你會得到什麼? – 2010-02-01 12:25:42

+0

我不會在我的表中有一個幾乎總是爲空的FK列 – Omu 2010-02-01 12:35:06

1

你想要的是引用(X => x.RefToA);

以下是來自流利的nhibernate文檔。

參考/多到一個

參考是一個用於創建多到一的兩個實體之間的關係;你正在引用另一個實體,所以你使用了References方法。引用是對實體

http://wiki.fluentnhibernate.org/Fluent_mapping

+0

是的,但是這會創建一個FK id列,我不想這樣做,我需要第三張表格 – Omu 2010-02-01 11:57:42

+0

然後你想要的是HasOne(x => x.RefToA); 任何你不想爲第三張桌子PK的理由?遺產? – 2010-02-01 12:01:51

+0

我的表中不需要另外一個FK列,因爲大多數情況下這個列都是空的,所以這就是爲什麼我想把它放到第三個表中,我可以用HasManyToMany做到這一點,但是通過這種方法,我將不得不一直寫MyCollectionProperty [0](因爲它可能不會超過一個) – Omu 2010-02-01 12:06:16

0

您不應該將一對多關係映射爲多對多關係,然後強制它成爲一對多關係。其糟糕的設計,並沒有促進數據的完整性。如果我是你,我會創建表如下

CREATE TABLE A(
    Id INT PRIMARY KEY IDENTITY(1,1), 
    --Your other columns 
) 

CREATE TABLE B(
    Id INT PRIMARY KEY IDENTITY(1,1), 
    AId INT REFERENCES A NULL, 
    --Your other columns 
) 

這樣的話,你可以選擇你想要的方式將它們映射到功能NHibernate,或任何其他的ORM。

相關問題