2011-03-31 47 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>