NHibernate Mapping для класса, содержащего несколько классов - PullRequest
0 голосов
/ 31 марта 2011

У меня проблема с отображением NHibernate. У меня есть Класс Компания, Персона и Адрес; Компания и Персона оба могут иметь Адреса, поэтому я взял Адрес в обоих. Для хранения у меня есть таблицы Company, Person и Address. Теперь у Компании будет объект Address, а у Person также будет объект Address, поэтому в Address также должна быть ссылка на объект Company и Person. Поэтому я создал два дочерних класса адреса 1. CompanyAddress 2. PersonAddress, а в базе данных я создал еще две таблицы Company_Address и Person_Address. Теперь в Address.hbm.xml я добавил подкласс Joined для CompanyAddress и PersonAddress, которые ссылаются на таблицы Company_Address и Person_Address соответственно.

Теперь в классе CompanyAddress есть объект company, а в классе PersonAddress - объект Person.

Company_Address имеет 2 столбца AddressId (PK) и CompanyId (FK) -> Company Person_Address имеет 2 столбца AddressId (PK) и PersonId (FK) -> Person

Я создал однозначное сопоставление в Company.hbm.xml для адреса. Когда я сохраняю объект компании, каждая таблица заполняется правильно, кроме Company_Address. AddressId сохраняется, но CompanyId не сохраняется.

Я понятия не имею, как заставить это работать

Если кто-то может столкнуться с этой проблемой, пожалуйста, помогите.

Заранее спасибо !!! Паван Шукла

Ответы [ 2 ]

0 голосов
/ 31 марта 2011

Звучит так, как будто вы здесь чрезмерно нормализованы, учитывая, что вы настроили однозначное сопоставление. Что может быть проще (и 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 голосов
/ 31 марта 2011

Не делай так.Адрес явно не является сущностью (и, следовательно, не имеет собственной таблицы и первичного ключа).Что бы я предпочел сделать, это смоделировать его как компонент.Пример отображения может выглядеть следующим образом:

<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 заключается в использовании компонентов.

...