2010-04-06 56 views
0

我找不到這個特定問題的答案。我試圖保持我的領域模型面向對象,並在可能的情況下重新使用對象。我有一個問題,確定如何提供從單行到多個類的映射。讓我以一個例子來解釋:NHibernate:從單個表格行中映射多個類

我有一張表,叫它Customer。顧客有幾個屬性;但爲了簡潔起見,假定它有Id,Name,Address,City,State,ZipCode。

我想創建一個Customer和Address類,如下所示:

public class Customer { 
    public virtual long Id {get;set;} 
    public virtual string Name {get;set;} 
    public virtual Address Address {get;set;} 
} 

public class Address { 
    public virtual string Address {get;set;} 
    public virtual string City {get;set;} 
    public virtual string State {get;set;} 
    public virtual string ZipCode {get;set;} 
} 

我有被確定的映射是什麼Customer類中的地址類的麻煩是什麼。沒有地址表,並且沒有與客戶關聯的「地址集」。我只想在代碼中使用更多的面向對象的Customer表。還有其他幾個表中有地址信息,最好有一個可重用的Address類來處理它們。地址不共享,因此將所有地址分配到帶有外鍵的單獨表中似乎是矯枉過正的,而且實際上更加痛苦,因爲我需要將外鍵用於多個表。

有人能告訴我這種類型的映射嗎?如果可以,請提供一個例子。

感謝您的任何見解!

-Mike

回答

8

你應該在你的NHibernate映射文件中使用一個Component。 例如:

<class name="Customer" 
table="Customer"> 

<id name="Id"> 
    <generator class="identity"/> 
</id> 
<property name="Name" /> 
<component name="Address"> 
    <property name="Address"/> 
    <property name="City"/> 
    <property name="State"/> 
    <property name="ZipCode"/> 
</component> 
</class> 

更多可以在Ayende's blog被讀到它。

+0

當組件需要成爲接口或抽象類型時,如何映射組件?例如一個IPayment,並非所有的IPayment實現都包含信用卡#? – 2012-03-16 13:59:13