Я использую 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>
Пожалуйста, кто-нибудь может помочь.