首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有optimistic lock=“version”和NHibernate - update =“true”的动态映射正在生成无效的update语句

具有optimistic lock=“version”和NHibernate - update =“true”的动态映射正在生成无效的update语句
EN

Stack Overflow用户
提问于 2010-04-08 00:26:39
回答 2查看 3.1K关注 0票数 2

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

下面是映射:

代码语言:javascript
复制
<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为:

代码语言:javascript
复制
UPDATE groups SET WHERE GroupNumber = 11111 AND TS=0x00000007877

这显然是无效的,因为没有SET语句。如果我删除了动态更新部分,那么在这个update语句中,所有内容都会更新。这使得语句有效,但并不是必需的。

以前有没有人见过这个问题?我是不是遗漏了什么?

谢谢,史蒂夫

EN

回答 2

Stack Overflow用户

发布于 2010-12-03 00:08:09

我遇到了完全相同的问题,我花了很长一段时间才把文档弄得乱七八糟,最后才让它正常工作。您需要将bag元素上的on lock属性设置为false。这将阻止NH在未更改任何可更新属性时将父对象标记为更新。我希望这对你有用。

票数 1
EN

Stack Overflow用户

发布于 2010-04-08 00:50:33

尝试在id元素中设置unsaved-value属性;这将允许NHibernate区分新记录和现有记录,并避免时间戳问题。

代码语言:javascript
复制
<id name="GroupNumber" unsaved-value="" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2594131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档