多个类包含的类的NHibernate映射

多个类包含的类的NHibernate映射,nhibernate,foreign-key-relationship,Nhibernate,Foreign Key Relationship,我在NHibernate映射中遇到问题。 我有班级公司、人员和地址;公司和个人都可以有地址,因此我在这两个地址。为了存储这些信息,我有公司、人员和地址表。现在公司将有Address对象,Person也将有Address对象,所以Address也应该有对Company和Person对象的引用。所以我创建了地址1的两个子类。公司地址2。在数据库中,我又创建了两个表Company\u Address和Person\u Address。现在,在Address.hbm.xml中,我为CompanyAddr

我在NHibernate映射中遇到问题。 我有班级公司、人员和地址;公司和个人都可以有地址,因此我在这两个地址。为了存储这些信息,我有公司、人员和地址表。现在公司将有Address对象,Person也将有Address对象,所以Address也应该有对Company和Person对象的引用。所以我创建了地址1的两个子类。公司地址2。在数据库中,我又创建了两个表Company\u Address和Person\u Address。现在,在Address.hbm.xml中,我为CompanyAddress和PersonalAddress添加了联接子类,它们分别引用Company_Address和Person_Address表

现在CompanyAddress类中有company对象,PersonalAddress类中有Person对象

公司地址有两列AddressId(PK)和CompanyId(FK)->Company Person_Address有两列AddressId(PK)和PersonId(FK)->Person

我已经在Company.hbm.xml中为Address创建了一对一映射。 当我保存Company对象时,除了Company\u Address之外,每个表都正确填充。 正在存储AddressId,但未存储CompanyId

我不知道该怎么做

如果有人能面对这个问题,请帮助

提前感谢!!!
Pawan Shukla不要这样做。地址显然不是一个实体(因此没有自己的表,也没有主键)。我更愿意做的是将其建模为一个组件。示例映射可能如下所示:

<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>
<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>


只要谷歌一下。在DDD中,有一个与实体相对的值对象的概念,在NHibernate中对值对象建模的方法是使用组件。

鉴于您已经设置了一对一的映射,听起来您可能已经过度规范化了。更简单的方法(代码更简洁)是将地址字段放在公司和个人表中,然后设置一个简单的地址对象并将其视为一个组件。这是我的地址类:

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;
    }
}
然后将地址视为一个组件,并将其映射如下:

<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>
<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>