【问题标题】:SCOPE_IDENTITY when inserting values插入值时的 SCOPE_IDENTITY
【发布时间】:2017-06-05 14:50:41
【问题描述】:

我在尝试执行我的 ORM 程序时收到此错误消息。

NHibernate.Exceptions.GenericADOException: '无法插入: [NHibernateWinFormsApp.Employee][SQL: INSERT INTO Employee DEFAULT 价值观;选择 SCOPE_IDENTITY()]'

这是我的映射文件编辑

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="NHibernateWinFormsApp"
                   namespace="NHibernateWinFormsApp">

  <class name="Employee">
    <id name="EmployeeId" column="EmployeeId">
      <column name="EmployeeId" not-null="true" />
      <column name="FirstName" />
      <column name="LastName" />
      <generator class="native"/>
    </id>

    <bag name="Department" table="EmployeeDepartment" >
      <key column="EmployeeId" not-null="true" />
      <many-to-many class="Department" column="DepartmentId"/>
    </bag>
  </class>

  <class name="Department">
    <id name="DepartmentId">
      <column name="DepartmentId" not-null="true" />
      <column name="DepartmentName" />
      <generator class="native"/>
    </id>

    <bag name="Employee" table="EmployeeDepartment" inverse="true">
      <key column="DepartmentId" not-null="true"/>
      <many-to-many class="Employee" column="EmployeeId"/>
    </bag>
    <property name="DepartmentName" type="string"/>
  </class>

</hibernate-mapping>

然后,进入我的会话:

DepartmentRepository departmentRepository = new DepartmentRepository(session);

// get department by id
Department department = departmentRepository.GetById(int.Parse(textDepartment.Text));
employeeData.Department = new List<Department>();
employeeData.Department.Add(department);
department.Employee.Add(employeeData);

有人知道如何解决这个小问题吗?

【问题讨论】:

  • @ahmedab​​delqader 我不确定我是否可以同意。请告诉我我是否错了。 :)
  • 这是完整的错误信息吗?对我来说,它看起来被截断了。 SQL-Server 应该提供更多信息。检查内部异常,寻找SqlException 并查阅他们的Errors 属性。否则捕获失败的插入 SQL 并直接在您的数据库上重放它。
  • @Frédéric Message=could not insert: [NHibernateWinFormsApp.Employee][SQL: INSERT INTO Employee DEFAULT VALUES; select SCOPE_IDENTITY()]
  • @Frédéric SqlException: Violation of UNIQUE KEY constraint 'Code'. Cannot insert duplicate key in object 'dbo.Employee'. The duplicate key value is (&lt;NULL&gt;, &lt;NULL&gt;).

标签: c# sql-server visual-studio nhibernate orm


【解决方案1】:

您似乎没有映射一些必须在两条记录之间具有不同值的列。所以他们总是插入null,但你只能有一个这样的员工,导致所有其他插入失败。

要么删除该约束,要么放松它(通过将其替换为忽略null 值的过滤唯一索引),或者将这些列映射到某些属性并为每个员工赋予它们唯一值。

但是,您的问题的底线是:始终咨询所有 InnerException 及其特定属性(如果有)。这不是 NHibernate 特定的建议,您应该在遇到的所有异常情况下都这样做。

【讨论】:

  • 是的,我认为问题出在映射文件中。我会去找它,然后brb。谢谢你,@Frédéric。
  • 你好,@Frédéric。我更改了映射文件(请参阅上面的编辑)。我收到了这条消息Foreign key (FKCE90096CDE039EE9:EmployeeDepartment [DepartmentId])) must have same number of columns as the referenced primary key (Department [DepartmentId, DepartmentName])。我不确定我是否理解多对多映射的原理。原谅我的无知:)
  • @user7879148 不要将问题转换为另一个问题。问一个新的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多