Отображение NHibernate с optimistic-lock = version и dynamic-update = true генерирует недопустимый оператор обновления

У меня есть объект «Группа» с назначенным идентификатором, который добавляется к агрегату для его сохранения. Это вызывает проблему, потому что NHibernate не может определить, новый он или существующий. Чтобы исправить эту проблему, я изменил сопоставление, чтобы объект Group использовал оптимистическую блокировку в столбце версии sql timestamp. Это вызвало новую проблему. В группе есть набор подобъектов. Поэтому, когда NHibernate сбрасывает новую группу в базу данных, он сначала создает запись группы в таблице групп, затем вставляет каждый из подчиненных объектов, а затем выполняет обновление записей группы для обновления значения временной метки. Однако sql, сгенерированный для завершения обновления, недействителен, если сопоставление имеет значения dynamic-update = "true" и optimistic-lock = "version".

Вот отображение:

<class xmlns="urn:nhibernate-mapping-2.2" dynamic-update="true" mutable="true" optimistic-lock="version" name="Group" table="Groups">
    <id name="GroupNumber" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="GroupNumber" length="5" />
      <generator class="assigned" />
    </id>
    <version generated="always" name="Timestamp" type="BinaryBlob" unsaved-value="null">
      <column name="TS" not-null="false" sql-type="timestamp" />
    </version>
    <property name="UID" update="false" type="System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="GroupUID" unique="true" />
    </property>
    <property name="Description" type="AnsiString">
      <column name="GroupDescription" length="25" not-null="true" />
    </property>
    <bag access="field.camelcase-underscore" cascade="all" inverse="true" lazy="true" name="Assignments" mutable="true" order-by="GroupAssignAssignment">
      <key foreign-key="fk_Group_Assignments">
        <column name="GroupNumber" />
      </key>
      <one-to-many class="Assignment" />
    </bag>
    <many-to-one class="Aggregate" name="Aggregate">
      <column name="GroupParentID" not-null="true" />
    </many-to-one>
  </class>
</hibernate-mapping> 

Когда сопоставление включает как динамическое обновление, так и оптимистическую блокировку, создается sql:

UPDATE groups SET WHERE GroupNumber = 11111 AND TS=0x00000007877

Очевидно, это неверно, поскольку нет операторов SET. Если я удалю часть динамического обновления, вместо этого все будет обновлено во время этого оператора обновления. Это делает заявление достоверным, но, скорее, ненужным.

Кто-нибудь видел эту проблему раньше? Я что-то упускаю?

Спасибо Стив


person SteveBering    schedule 07.04.2010    source источник
comment
вы можете создать автономный тестовый набор?   -  person Mauricio Scheffer    schedule 08.04.2010


Ответы (2)


У меня была точно такая же проблема, и мне потребовалось время, чтобы наткнуться на документацию, прежде чем я наконец заставил ее работать. Вам необходимо установить для атрибута optimistic-lock вашего элемента сумки значение false. Это остановит NH от отметки родительского элемента для обновления, если обновляемые свойства не были изменены. Надеюсь, это сработает для вас.

person sca_tone    schedule 02.12.2010

Попробуйте установить атрибут unsaved-value в элементе id; это должно позволить NHibernate различать новые и существующие записи и обойти проблему с отметками времени.

<id name="GroupNumber" unsaved-value="" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">

Документация наводит меня на мысль, что по умолчанию должна быть пустая строка, но попробовать стоит.

person Jamie Ide    schedule 07.04.2010
comment
Похоже, это не повлияло на сгенерированный запрос. - person SteveBering; 08.04.2010