У меня есть объект «Группа» с присвоенным идентификатором, который добавляется в агрегат, чтобы сохранить его. Это вызывает проблему, потому что NHibernate не может сказать, является ли он новым или существующим. Чтобы устранить эту проблему, я изменил отображение, чтобы заставить объект группы использовать оптимистическую блокировку для столбца версии 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. Если я удаляю часть динамического обновления, все обновляется во время этого оператора обновления. Это делает утверждение действительным, но скорее ненужным.
Кто-нибудь видел эту проблему раньше? Я что-то упустил?
Спасибо, Стив