NHibernate StaleObjectStateException при использовании оптимистичной блокировки версий для объекта с отношением один ко многим - PullRequest
0 голосов
/ 20 мая 2009

Я использую NHibernate и ASP.Net, используя сеанс для каждого запроса, как предложено в статье лучших практик Билли МакКафферти (извините, я не могу включить ссылку). Я успешно использовал это с оптимистичной блокировкой версии, сохраняя обновленные объекты в объекте сеанса HTTP и повторно подключаясь к сеансу NHibernate с помощью метода SaveOrUpdate.

Однако моя последняя страница требует обновления коллекции дочерних объектов. Я использовал метод, предложенный в родительском дочернем примере руководства NHibernate (глава 17). Это работает при загрузке и сохранении в одном запросе. Однако при загрузке в одном запросе, сохранении в сеансе HTTP и повторном присоединении в последующем запросе с использованием SaveOrUpdate я получаю исключение StaleObjectException при очистке сеанса NHibernate. Это происходит, даже если в коллекцию дочерних объектов не вносятся изменения.

Изменения, внесенные в свойства родительского объекта, сохраняются в базе данных, поэтому может показаться, что NHibernate пытается обновить объект дважды. Я подозреваю, что это как-то связано с каскадными опциями в отображении, но они необходимы для правильной работы отношений между родителями и детьми.

Вот мои файлы сопоставления:

Отображение родительского класса

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="NHS.WebTeam.PharmacyFirst.Medication, PharmacyFirst" table="Medication" lazy="false" optimistic-lock="version" where="Deleted=0">
    <id name="ID" column="Medication_ID" unsaved-value="0">
      <generator class="identity" />
    </id>

    <version column="version" name="Version"/>
    <property name="Deleted" column="Deleted" />

    <property name="Name" column="Name" />

    <bag name="Prices" access="field.camelcase-underscore" lazy="false" inverse="true" cascade="all">
      <key column="Medication_ID"/>
      <one-to-many class="NHS.WebTeam.PharmacyFirst.MedicationPrice, PharmacyFirst" />
    </bag>

  </class>
</hibernate-mapping>

Отображение дочерних классов

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="NHS.WebTeam.PharmacyFirst.MedicationPrice, PharmacyFirst" table="Medication_Price" lazy="false" optimistic-lock="version" where="Deleted=0">
    <id name="ID" column="Medication_ID" unsaved-value="0">
      <generator class="identity" />
    </id>

    <many-to-one name="Medication" column="medication_id" not-null="true" cascade="none"/>
    <property name="DateFrom" column="Date_From" />
    <property name="Price" column="Price" />

  </class>
</hibernate-mapping>

Пожалуйста, кто-нибудь может помочь.

1 Ответ

0 голосов
/ 28 августа 2009

Для всех, кто обнаружил это, похоже, что проблема была исправлена ​​в nhibernate 2.1, поэтому вам просто нужно обновить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...