SqlException:无法将值 NULL 插入列“x”;列不允许空值。插入失败

Posted

技术标签:

【中文标题】SqlException:无法将值 NULL 插入列“x”;列不允许空值。插入失败【英文标题】:SqlException: Cannot insert the value NULL into column 'x'; column does not allow nulls. INSERT fails 【发布时间】:2017-10-31 01:33:18 【问题描述】:

当我使用 NHibernate 执行我的“小”程序时收到此消息

SqlException: Cannot insert the value NULL into column 'EmployeeId', table 'NHibernateDemoDB.dbo.Employee'; column does not allow nulls. INSERT fails.

我的方法是:

    private void SetEmployeeInfo(Employee employeeData)
    
        employeeData.FirstName = txtFirstName.Text;
        employeeData.LastName = txtLastName.Text;
    

还有我的映射文件:

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" namespace="NHibernateWinFormsApp" assembly="NHibernateWinFormsApp">

<class name="NHibernateWinFormsApp.Employee, NHibernateWinFormsApp" lazy="true">

    <id name="EmployeeId">

      <generator class="native"/>

    </id>

    <property name="FirstName" column="FirstName"/>

    <property name="LastName" column="LastName"/>

  </class>
</hibernate-mapping>

请问有人有想法吗? 谢谢,

【问题讨论】:

列 X 需要一个值,而您还没有传递一个值。什么是 X 列? 信息很清楚 我有一个想法!它希望EmployeeId 的值不为空。我赢了什么,一把锤子? @user7879148 如果它不允许空值,试着想象你可以给它什么其他值。有没有一种不是null 值的值?也许有。也许这就是它想要的价值。试一试,你会失去什么? 如果它是表的主键并且不允许空值并且不会自动生成值,那么我的第一个猜测是值在另一个表中,或者表应该设置为自动生成值...这是您创建的表吗?查看IDENTITY 属性 【参考方案1】:

您的数据库表中的列定义肯定是错误的,缺少identity 规范。

由于您已将 id 映射到生成器 native,它解析为 sql-server 的 identity,NHibernate 尝试插入实体而不为 Id EmployeeId 指定值,因为它应该是自动的- 由数据库插入时生成。

由于此时它失败了,这意味着您的表定义无效,它没有将EmployeeId 设置为Identity 列,导致它在插入时不会自动生成,因此缺少值。

您必须在数据库中的表上修复列定义。

否则,为您的 id 选择另一个 generator strategy,与您的数据库架构兼容。

【讨论】:

是的,它是自动增量。而已!问题解决了。谢谢大家!【参考方案2】:

该列不允许为空。如消息错误所述。

获取空值时需要指定一个值。使用 ISNULL 函数。

【讨论】:

这是一个 NHibernate 映射实体,其 id 的生成器不是 assigned。 NHibernate 不会让用户指定它的值。 嗯,明白了。不知道这个

以上是关于SqlException:无法将值 NULL 插入列“x”;列不允许空值。插入失败的主要内容,如果未能解决你的问题,请参考以下文章

无法将值 NULL 插入“ID”列

无法将值 NULL 插入列 CreationTime

无法将值 NULL 插入列 - 如何强制标识增加? [关闭]

无法将值 NULL 插入列“id”、表“XXX”;列不允许空值。插入失败

EF Code First - 无法将值 NULL 插入列

无法将值 NULL 插入列“EmpId”[关闭]