插入nhibernate sql server后无法检索生成的id

时间:2015-03-25 21:25:44

标签: c# sql-server nhibernate last-insert-id

我正在使用NHibernate和SQL Server构建一个C#应用程序。当我尝试保存实体(使用身份生成器)时,我收到错误'在插入'后无法检索生成的ID。有谁知道为什么我真的得到这个错误?我错误配置了什么吗?我该如何解决这个问题?

我在MySQL中完成了这个问题,没有任何问题。 谢谢。

数据库:

CREATE TABLE [dbo].[SubscriptionType] (
SubscriptionTypeID      INT             NOT NULL IDENTITY(1,1),
Name                    VARCHAR(255)    NOT NULL
PRIMARY KEY(SubscriptionTypeID)
);

Hibernate映射:

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

  <class name="CompanySubscriptionType" table="[SubscriptionType]" lazy="false">
    <id name="SubscriptionTypeID" column="SubscriptionTypeID">
      <generator class="native" />
    </id>

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

  </class>
</hibernate-mapping>

错误:

  

[SqlException(0x80131904):&#39; LAST_INSERT_ID&#39;不是公认的内置函数名称。]

1 个答案:

答案 0 :(得分:0)

NHibernate (一般是ORM)的真正重要优势在于我们不必解析当前使用的数据库引擎的特定SQL语法。如果我们设法使用NHibernate的标准化API - 我们几乎可以针对任何数据库引擎运行我们的代码。唯一重要的设置是 DIALECT ,它允许NHibernate正确地将其转换为与数据库引擎相关的SQL:

3.5.1. SQL Dialects

  

您应该始终将dialect属性设置为数据库的正确NHibernate.Dialect.Dialect子类。除非您希望使用本机或序列主键生成或悲观锁定(例如,使用ISession.Lock()或IQuery.SetLockMode()),否则这不是严格必需的。但是,如果指定方言,NHibernate将对上面列出的某些其他属性使用合理的默认值,从而省去了手动指定它们的工作量。

因此,如果以前的代码运行时与MySQL相关的设置

<property name="dialect">NHibernate.Dialect.MySQLDialect</property>

现在,在使用SQL Server时,我们需要它的Dialect

<property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property>