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>