首页 文章

NHibernate映射由多个类包含的类

提问于
浏览
0

我在NHibernate映射中遇到问题 . 我有 class 公司,人员和地址;公司和个人都可以拥有地址,因此我在两者中都采用了地址 . 为了存储这个,我有公司,人员和地址表 . 现在公司将拥有Address对象,Person也将具有Address Object,因此Address也应该引用Company和Person对象 . 所以我创建了两个地址1的子类.CompanyAddress 2. PersonAddress和在数据库中我创建了另外两个表Company_Address和Person_Address . 现在在Address.hbm.xml中,我为CompanyAddress和PersonAddress添加了Joined子类,它们分别引用了Company_Address和Person_Address表 .

现在,CompanyAddress类中包含公司对象,而PersonAddress类中包含Person对象 .

Company_Address有2列AddressId(PK)和CompanyId(FK) - >公司Person_Address有2列AddressId(PK)和PersonId(FK) - > Person

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

我不知道如何让这个工作

如果有人可以遇到这个问题,请帮忙 .

提前致谢!!! Pawan Shukla

2 回答

  • 0

    听起来你可能已经过度规范了,因为你已经 Build 了一对一的映射 . 可能更容易(和代码中的WAY更清晰)是将地址字段放在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>
    
  • 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中建模值对象的方法是使用组件 .

相关问题