2014-04-29 58 views
0

我有多對多的關係。Nhibernate多對多:3桌hbm mapping

表A,表B和表AB。 表AB將包括2列,A_Id和B_id .. 主鍵需要來自兩個列。

許多B記錄可以引用一個A記錄。但是對於B中的每條記錄,只有一個A記錄是變異的

什麼是HBM和POCO類中的正確語法?

預先感謝

+0

你可以使用CompositeId從多個cols聲明ID(例如:http://www.codeproject.com/Tips/419780/NHibernate-Mappings-for-Composite-Keys-with- Associ) –

+0

我不想使用複合id作爲表格。因爲我使用Id作爲其他表的關係。 – Shir

回答

0

這是一個基於相當明顯的例子,在文檔中的一個例子:23.2. Author/Work

<class name="A" table="A" > 

    <id name="Id" column="A_Id" generator="native" /> 

    <bag name="Bs" table="AB" lazy="true"> 
     <key column="A_Id"> 
     <many-to-many class="B" column="B_Id" not-null="true" /> 
    </bag> 
    ... 
</class> 


<class name="B" table="B" > 

    <id name="Id" column="B_Id" generator="native" /> 

    <bag name="As" table="AB" lazy="true" inverse="true"> 
     <key column="B_Id"> 
     <many-to-many class="A" column="A_Id" not-null="true" /> 
    </bag> 
    ... 
</class> 

,這將是在C#中的類

public class A 
{ 
    public virtual int Id { get; set; } 
    public virtual IList<B> Bs { get; set; } 
} 

public class B 
{ 
    public virtual int Id { get; set; } 
    public virtual IList<A> As { get; set; } 
} 

表AB在這裏是隱式映射的......沒有明確的配對對象AB

但我自己的首選方法是用AB_ID替代關鍵字擴展表AB,並將其映射爲標準對象。如果你喜歡閱讀更多關於明確的配對對象映射實體:

更新相關評論認爲B能有隻有一個

在這種情況下,我們不需要AB表。在B應該有列A_ID,表達RELA參考:

<class name="A" table="A" > 

    <id name="Id" column="A_Id" generator="native" /> 

    <bag name="Bs" table="B" lazy="true"> 
     <key column="A_Id"> 
     <!-- not MANY but ONE-TO-Many --> 
     <one-to-many class="B" /> 
    </bag> 
    ... 
</class> 


<class name="B" table="B" > 

    <id name="Id" column="B_Id" generator="native" /> 

    <many-to-one name="A" column="A_Id" /> 
    ... 
</class> 

的實體

// This class is the same 
public class A 
{ 
    public virtual int Id { get; set; } 
    public virtual IList<B> Bs { get; set; } 
} 
// here just a reference 
public class B 
{ 
    public virtual int Id { get; set; } 
    public virtual A A { get; set; } 
} 

的事情是,它要麼是many-to-many和表AB到位 - 與否。沒有什麼我會說

+0

謝謝。也許我還不夠清楚。 A不是很多。 A可以有多個B記錄參考一個A記錄。但是對於B中的每條記錄,只有一條A記錄是變異的。 對不起,我的錯誤。 什麼是現在正確的語法?謝謝 – Shir

+0

那麼關鍵是,我們將**不需要(刪除)表「AB」。然後,B表將具有'A_Id'列,並且映射對於A是類似的,但是B將使用'<多對一'而不是集合。這是你想要的嗎?我可以延長我的答案,如果這是你想要的 –

+0

我理解你的解決方案。但要求有AB表,儘管我們可以像你的建議那樣做。 那麼我需要做什麼? 謝謝。 – Shir