C# 由于列的版本为空,无法保存实体。亚硝酸铵

C# 由于列的版本为空,无法保存实体。亚硝酸铵,c#,.net,nhibernate,concurrency,C#,.net,Nhibernate,Concurrency,我有一个非常直接的映射: <?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="XXXX.DomainLayer" namespace="XXXX.DomainLayer.Entities"> <class name="Project" optimistic-lock="version">

我有一个非常直接的映射:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="XXXX.DomainLayer" namespace="XXXX.DomainLayer.Entities">
    <class name="Project" optimistic-lock="version">
        <id name="Id" column="ProjectID" unsaved-value="00000000-0000-0000-0000-000000000000">
            <generator class="guid.comb" />
        </id>
        <version name="Version" generated="always" type="BinaryBlob" />
    <!-- poperties -->
    </class>
</hibernate-mapping>
其中存储库更新方法如下所示:

public void Update(T entity) {
    using(var tx = this.session.BeginTransaction()) {
        /* try { */
            this.session.SaveOrUpdate(entity);
            tx.Commit();
        /* }
        catch(StaleObjectStateException) {
            try {
                entity = this.session.Merge(entity);
                tx.Commit();
            }
            catch(Exception) {
                tx.Rollback();
                throw;
            }
        }
        */
    }
}
DI件


谢谢

您确定使用的类型正确吗

发件人:

版本号可以是Int64、Int32、Int16、Ticks、Timestamp、, 或TimeSpan或.NET 2.0中可为空的对应项


您确定使用的类型正确吗

发件人:

版本号可以是Int64、Int32、Int16、Ticks、Timestamp、, 或TimeSpan或.NET 2.0中可为空的对应项


我偶然发现了一个非常明显的解决方案:

<id name="Id" column="ProjectID" unsaved-value="00000000-0000-0000-0000-000000000000">
        <generator class="guid.comb" />
    </id>
    <version name="Version" generated="always" type="BinaryBlob">
        <column name="Version" not-null="false" />
    </version>
<!-- ... the rest -->
编辑


但这一更改给我带来了另一个问题:SqlServer不更新版本列。。。它总是保持为空。

我偶然发现了一个非常明显的解决方案:

<id name="Id" column="ProjectID" unsaved-value="00000000-0000-0000-0000-000000000000">
        <generator class="guid.comb" />
    </id>
    <version name="Version" generated="always" type="BinaryBlob">
        <column name="Version" not-null="false" />
    </version>
<!-- ... the rest -->
编辑


但这一更改给我带来了另一个问题:SqlServer不更新版本列。。。它始终保持为空。

尝试将sql type=timestamp添加到版本列映射。例如

<version name="Version" generated="always" unsaved-value="null" type="BinaryBlob">
    <column name="Version" not-null="false" sql-type="timestamp"/>
</version>

尝试将sql type=timestamp添加到版本列映射。例如

<version name="Version" generated="always" unsaved-value="null" type="BinaryBlob">
    <column name="Version" not-null="false" sql-type="timestamp"/>
</version>

在Benjamin Perkins的书中找到的我明白了。。。我不知道有什么问题。也许你可以试试其他类型的?在Benjamin Perkins的书“第174页我明白了…”。。。我不知道有什么问题。也许您可以尝试使用其他类型?您是否尝试将sql类型设置为timestamp,未保存的值设置为null查看我的答案?您是否尝试将sql类型设置为timestamp,未保存的值设置为null查看我的答案?
<version name="Version" generated="always" unsaved-value="null" type="BinaryBlob">
    <column name="Version" not-null="false" sql-type="timestamp"/>
</version>