2011-03-31 46 views
0

我在NHibernate映射中遇到問題。 我有班級公司,人員和地址;公司和個人都可以有地址,因此我已經在兩個地址。爲了存儲這個我有表公司,人員和地址。現在公司將具有地址對象,人員也將具有地址對象,因此地址也應該引用公司和人員對象。所以我創建了Address 1的兩個子類。CompanyAddress 2. PersonAddress和In Database我創建了兩個表Company_Address和Person_Address。現在在Address.hbm.xml中,我爲CompanyAddress和PersonAddress分別引用了Company_Address和Person_Address表,並添加了Join子類。由多個類包含的類的NHibernate映射

現在CompanyAddress類中有公司對象,PersonAddress類中有Person對象。

Company_Address由具有2列AddressId(PK)和CompanyId(FK) - >公司 Person_Address由具有2列AddressId(PK)和PERSONID(FK) - >人

我已經建立一對一Company.hbm.xml中Address的一個映射。 當我保存公司對象時,除了Company_Address之外,每個表格都正確填充。 AddressId正在儲存,但CompanyId沒有儲存。

我不知道如何得到這個工作

如果有人能面對這個問題,請幫助。

在此先感謝! Pawan Shukla

回答

0

不要這樣做。地址顯然不是一個實體(因此沒有它自己的表,也沒有主鍵)。我寧願做的是將其建模爲一個組件。示例映射可能如下所示:

<class name="Company" 
    table="Company"> 

    <id name="Id"> 
     <generator class="identity"/> 
    </id> 
    <property name="CompanyName" /> 
    <component name="Address"> 
     <property name="Street"/> 
     <property name="HouseNumber"/> 
     <property name="City"/> 
     <property name="PostOffice"/> 
    </component> 
</class> 

只是谷歌了一下。在DDD中,有一個與實體相對的值對象的概念,在NHibernate中爲值對象建模的方法是使用組件。

0

這聽起來像你可能在這裏過度規範化,因爲你已經建立了一對一的映射。什麼可能更容易(並且代碼更乾淨)是將地址字段放置在Company和Person表中,然後設置一個簡單的地址對象並將其視爲組件。這是我的地址類:

public class StreetAddress 
{ 
    public string CountryCode { get; set; } 
    public string Street { get; set; } 
    public string City { get; set; } 
    public string County { get; set; } 
    public string StateCode { get; set; } 
    public string PostalCode { get; set; } 

    public StreetAddress() 
    { 
     // Constructor for NHibernate 
    } 

    public StreetAddress(string countryCode, string street, string city, string county, string stateCode, string postalCode) 
    { 
     CountryCode = countryCode; 
     Street = street; 
     City = city; 
     County = county; 
     StateCode = stateCode; 
     PostalCode = postalCode; 
    } 
} 

然後你把地址作爲一個組件,並將其映射這樣的:

<component name="Address" insert="true" update="true" optimistic-lock="true"> 
    <property name="CountryCode"> 
    <column name="Address_CountryCode" /> 
    </property> 
    <property name="Street"> 
    <column name="Address_Street" /> 
    </property> 
    <property name="City"> 
    <column name="Address_City" /> 
    </property> 
    <property name="County"> 
    <column name="Address_County" /> 
    </property> 
    <property name="StateCode"> 
    <column name="Address_StateCode" /> 
    </property> 
    <property name="PostalCode"> 
    <column name="Address_PostalCode" /> 
    </property> 
</component>