NHibernate和Integer列作为版本

时间:2019-06-07 10:40:35

标签: nhibernate concurrency nhibernate-mapping database-versioning

我正在尝试使用NHibernate * hbm.xml映射文件创建一个数据库表,该文件将具有用于并发检查的“版本控制”列。 Versioning列应为可为空的Integer。

尽管创建数据库很好,但使用映射文件作为参考,但会发生以下情况: *插入的第一个记录的版本号为NULL *先前插入的记录的更新失败,并带有“陈旧数据”异常

换句话说,无论我做什么,“版本”列始终为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>

任何想法和/或建议将不胜感激!

1 个答案:

答案 0 :(得分:0)

为什么需要可为空的版本列?无论如何,我认为问题是由您映射中的unsaved-value="0"引起的。由于可为空列的默认值为null-NHibernate认为该值已经生成,因此从不分配。您需要将其设置为null-unsaved-value="null“以使其与可为空的列一起使用。unsaved-value="0"对于不可为null的类型有意义。但是最好完全忽略此属性,让NHibernate进行s

另一个具有generated属性的问题。这与数据库生成有关-因此always表示该值是由数据库自动生成的。您应该将其删除或将其指定为generated="never"

我相信以下映射应该对您有用:

<version name="Version">
    <column name="`Version`" not-null="false" sql-type="int" />
</version>