无法保存瞬态实体。 NHibernate的

时间:2012-09-19 13:45:47

标签: .net asp.net-mvc nhibernate

映射

<class name="Project" optimistic-lock="version">
    <id name="Id" column="ProjectID" type="guid" unsaved-value="00000000-0000-0000-0000-000000000000">  
        <generator class="guid.comb" />
    </id>
    <version name="Version" generated="always" type="Int32" unsaved-value="0">
       <column name="Version" sql-type="int" not-null="true" />
    </version>
    <!-- properties -->
</class>

调试时,可以看到Version equals 0

public class Project {
    public virtual Guid Id { get; protected set; }
    public virtual Int32 Version { get; set; }
}

但是当发生保存异常时:

  

无法将值NULL插入“Version”列,表'XXXX.dbo.Project';列不允许空值。 INSERT失败。   声明已经终止。

为什么?

谢谢!

2 个答案:

答案 0 :(得分:2)

generated="always"表示数据库,而不是NHibernate,将生成此值,NH将在之后检索它。

如果不是这种情况,请删除该属性。实际上,您可以删除除name之外的所有属性,因为您要将它们设置为默认值。

答案 1 :(得分:1)

您使用的generated="always"类型为Int32

  

generated(可选 - 默认为never):指定此版本   属性值实际上是由数据库生成的。

您可以找到更多信息herehere

您可以将类型更改为Timestamp或删除属性。

我建议以这种方式更改您的Version媒体资源:

public virtual int Version { get; private set; }