【问题标题】:Cannot save transient entity. NHibernate无法保存临时实体。休眠
【发布时间】:2017-08-30 15:55:13
【问题描述】:

映射

<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 插入列“版本”、表“XXXX.dbo.Project”;列不允许空值。插入失败。 声明已终止。

为什么?

谢谢!

【问题讨论】:

    标签: .net asp.net-mvc nhibernate


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您正在使用 generated="always" 类型为 Int32

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

      您可以找到更多信息herehere

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

      我建议以这种方式更改您的 Version 属性:

      public virtual int Version { get; private set; }
      

      【讨论】:

        猜你喜欢
        • 2012-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-30
        • 2017-08-28
        相关资源
        最近更新 更多