带乐观锁的NHibernate映射=";版本;和动态更新=";“真的”;正在生成无效的update语句

带乐观锁的NHibernate映射=";版本;和动态更新=";“真的”;正在生成无效的update语句,nhibernate,timestamp,optimistic-locking,Nhibernate,Timestamp,Optimistic Locking,我有一个带有指定ID的实体“组”,它被添加到聚合中以保持它。这导致了一个问题,因为NHibernate无法判断它是新的还是现有的。为了解决这个问题,我更改了映射,使组实体在sql时间戳版本列上使用乐观锁定。这引起了一个新的问题。组有一包子对象。因此,当NHibernate将新组刷新到数据库时,它首先在Groups表中创建组记录,然后插入每个子对象,然后更新组记录以更新时间戳值。但是,当映射同时为dynamic update=“true”和optimistic lock=“version”时,为完

我有一个带有指定ID的实体“组”,它被添加到聚合中以保持它。这导致了一个问题,因为NHibernate无法判断它是新的还是现有的。为了解决这个问题,我更改了映射,使组实体在sql时间戳版本列上使用乐观锁定。这引起了一个新的问题。组有一包子对象。因此,当NHibernate将新组刷新到数据库时,它首先在Groups表中创建组记录,然后插入每个子对象,然后更新组记录以更新时间戳值。但是,当映射同时为dynamic update=“true”和optimistic lock=“version”时,为完成更新而生成的sql无效

以下是映射:

<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> 
这显然是无效的,因为没有SET语句。如果删除动态更新部分,则所有内容都会在更新语句期间更新。这使得该声明有效,但没有必要

以前有人见过这个问题吗?我错过什么了吗


谢谢,Steve

尝试在id元素中设置未保存的值属性;这将允许NHibernate区分新记录和现有记录,并避免时间戳问题

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


这让我相信这应该默认为空字符串,但值得一试。

我也遇到了同样的问题,我花了很长时间才在文档中摸索,最后才让它开始工作。 您需要将bag元素的乐观锁定属性设置为false。这将阻止NH在未更改任何可更新属性时将父项标记为更新。
我希望这对您有用。

这似乎对生成的查询没有影响。您能创建一个独立的测试用例吗?
<id name="GroupNumber" unsaved-value="" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">