NHibernate 和整数列作为版本
NHibernate and Integer Columns as Version
我正在尝试创建一个数据库 Table,使用 NHibernate *hbm.xml 映射文件,它将有一个用于并发检查的版本控制列。 Versioning 列应该是可为空的整数。
虽然数据库创建得很好,但使用映射文件作为参考,会发生以下情况:
* 第一条记录插入一个 NULL 值作为 Version
* 更新先前插入的记录失败并出现 "Stale Data" 异常
换句话说,无论我做什么,版本列始终为NULL。
我对使用 NHibernate 的并发控制有些陌生,所以我不太明白我做错了什么..
如果我使用时间戳作为版本,一切正常。但是,我的要求是使用整数。因此我的问题。
这是我的映射文件:
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="true" auto-import="false" assembly="New1.Backend" namespace="New1.BO">
<class name="Natrio" table="`Natrios`" schema="`dbo`">
<cache usage="read-write" />
<id name="Id" column="`Id`" type="System.Int32">
<generator class="NHibernate.Id.Enhanced.TableGenerator">
<param name="increment_size">200</param>
<param name="segment_value">Natrios</param>
<param name="optimizer">pooled-lo</param>
</generator>
</id>
<version name="Version" column="`Version`" type="System.Nullable`1[[System.Int32, mscorlib]], mscorlib" generated="always" unsaved-value="0">
<column name="`Version`" not-null="false" sql-type="int" />
</version>
<property name="Attribute" column="`Attribute`" type="String" not-null="false" length="100" />
</class>
</hibernate-mapping>
任何想法and/or建议将不胜感激!
为什么需要可为空的版本列?无论如何,我认为问题是由映射中的 unsaved-value="0"
引起的。由于可为 null 的列的默认值为 null
- NHibernate 认为该值已经生成,因此永远不会分配。您需要将其设置为 null - unsaved-value="null
" 以使其与可为空的列一起使用。并且 unsaved-value="0"
对 not-nullable 类型有意义。但最好完全省略此属性并让 NHibernate 为 s
generated
属性的另一个问题。它是关于数据库生成的——所以 always
意味着这个值是由数据库自动生成的。您应该删除它或将其指定为 generated="never"
.
我相信以下映射应该适合您:
<version name="Version">
<column name="`Version`" not-null="false" sql-type="int" />
</version>
我正在尝试创建一个数据库 Table,使用 NHibernate *hbm.xml 映射文件,它将有一个用于并发检查的版本控制列。 Versioning 列应该是可为空的整数。
虽然数据库创建得很好,但使用映射文件作为参考,会发生以下情况: * 第一条记录插入一个 NULL 值作为 Version * 更新先前插入的记录失败并出现 "Stale Data" 异常
换句话说,无论我做什么,版本列始终为NULL。 我对使用 NHibernate 的并发控制有些陌生,所以我不太明白我做错了什么..
如果我使用时间戳作为版本,一切正常。但是,我的要求是使用整数。因此我的问题。
这是我的映射文件:
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="true" auto-import="false" assembly="New1.Backend" namespace="New1.BO">
<class name="Natrio" table="`Natrios`" schema="`dbo`">
<cache usage="read-write" />
<id name="Id" column="`Id`" type="System.Int32">
<generator class="NHibernate.Id.Enhanced.TableGenerator">
<param name="increment_size">200</param>
<param name="segment_value">Natrios</param>
<param name="optimizer">pooled-lo</param>
</generator>
</id>
<version name="Version" column="`Version`" type="System.Nullable`1[[System.Int32, mscorlib]], mscorlib" generated="always" unsaved-value="0">
<column name="`Version`" not-null="false" sql-type="int" />
</version>
<property name="Attribute" column="`Attribute`" type="String" not-null="false" length="100" />
</class>
</hibernate-mapping>
任何想法and/or建议将不胜感激!
为什么需要可为空的版本列?无论如何,我认为问题是由映射中的 unsaved-value="0"
引起的。由于可为 null 的列的默认值为 null
- NHibernate 认为该值已经生成,因此永远不会分配。您需要将其设置为 null - unsaved-value="null
" 以使其与可为空的列一起使用。并且 unsaved-value="0"
对 not-nullable 类型有意义。但最好完全省略此属性并让 NHibernate 为 s
generated
属性的另一个问题。它是关于数据库生成的——所以 always
意味着这个值是由数据库自动生成的。您应该删除它或将其指定为 generated="never"
.
我相信以下映射应该适合您:
<version name="Version">
<column name="`Version`" not-null="false" sql-type="int" />
</version>