NHibernate, однозначное сопоставление, каскадная вставка - PullRequest
5 голосов
/ 03 мая 2009

У меня отношения один-к-одному между классом Company и классом CompanySettings. Когда я создаю новый объект Company, (объект CompanySettings создается в конструкторе Company для его свойства Settings), а затем

SaveOrUpdate(session, companyObject)

Я ожидаю, что ВСТАВКА будет каскадно переходить из Компании в настройки Компании. Однако этого не произойдет, если я не вызову SaveOrUpdate явно и для объекта CompanySettings.

Отображение файлов показано ниже:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"`>
  <class name="AST.Domain.Company, AST.Domain" table="Companies">
    <id name="EntityID" column="CompanyId">
      <generator class="guid.comb" />
    </id>
    <property name="CompanyName" />
    . . .
    <one-to-one name="Settings" class="AST.Domain.CompanySettings, AST.Domain"
                constrained="true" lazy="false" />
  </class>
</hibernate-mapping>

Мой файл сопоставления для класса настроек компании:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="AST.Domain.CompanySettings, AST.Domain" table="CompanySettings">
    <id name="EntityID" column="CompanyId">
      <generator class="foreign">
        <param name="property">Company</param>
      </generator>
    </id>
    <property name="MaxUsers" />
    <one-to-one name="Company" class="AST.Domain.Company, AST.Domain" />
  </class>
</hibernate-mapping>

Ответы [ 2 ]

5 голосов
/ 03 мая 2009

Вы пытались указать cascade="all" на вашем однозначном сопоставлении?

2 голосов
/ 03 мая 2009

Установить каскадный атрибут «один-к-одному» в отображении компании.

Но, на другой ноте: Задумывались ли вы о том, чтобы отображать CompanySettings как «компонент» компании вместо отдельной сущности?

Разве не так, что «CompanySettings» является «объектом стоимости» и должен лучше отображаться как компонент?

Сделав это, вы можете поместить значения CompanySettings в ту же таблицу, что и «Company», но они будут рассматриваться как отдельный класс.

Поскольку это сопоставление один к одному, я думаю, что это лучший вариант и для вашей модели данных.

Тогда ваше отображение будет выглядеть примерно так:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"`>
  <class name="AST.Domain.Company, AST.Domain" table="Companies">
    <id name="EntityID" column="CompanyId">
      <generator class="guid.comb" />
    </id>
    <property name="CompanyName" />
    . . .
    <component name="Settings" class="AST.Domain.CompanySettings, AST.Domain">
        <property name="MaxUsers" />
    </component>
  </class>
</hibernate-mapping>

У вас действительно будет 2 отдельных объекта (Company & CompanySettings, а Company будет иметь объект 'Companysettings', но настройки будут сохранены в таблице Company).

Или, есть ли какая-то особая причина, почему вы поместили CompanySettings в отдельную таблицу? Я имею в виду, это отношение один-к-одному, так что это совершенно не обязательно (и даже не очень хорошая практика :)).

...