2010-04-07 1 views
2

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

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

<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 заявления. Если я удалю динамическую часть обновления, все будет обновляться во время этого оператора обновления. Это делает утверждение действительным, но скорее ненужным.

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

Спасибо, Стив

+0

Вы можете создать отдельный тестовый файл? –

ответ

0

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

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

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

+0

Это, похоже, не повлияло на генерируемый запрос. – SteveBering

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^