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

Posted

技术标签:

【中文标题】插入 nhibernate sql server 后无法检索生成的 id【英文标题】:Could not retrieve generated id after insert nhibernate sql server 【发布时间】:2015-03-25 21:25:44 【问题描述】:

我正在使用 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)
);

休眠映射:

<?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): 'LAST_INSERT_ID' 不是可识别的内置函数名。]

【问题讨论】:

因为 nhibernate 没有被告知 SQL Server 使用 SCOPE_IDENTITY() 而不是 LAST_INSERT_ID? 啊,好吧,这可能是个愚蠢的问题,但我如何设置 nhibernate 以使用 SCOPE_IDENTITY() ? 对不起,不知道。你确定 nhibernate 通过 config 知道你正在使用 SQL Server 吗? 你太棒了,谢谢!我仍在使用 NHibernate.Dialect.MySQLDialect 而不是 NHibernate.Dialect.MsSQL2012Dialect。 【参考方案1】:

NHibernate 真正显着的优势(一般为 ORM) 是我们不必解决当前使用的 DB 引擎的特定 SQL 语法。如果我们设法使用 NHibernate 的标准化 API - 我们几乎可以针对任何数据库引擎运行我们的代码。唯一重要的设置是 DIALECT,它允许 NHibernate 正确地将其转换为与 DB 引擎相关的 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 时,我们需要它的方言

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

【讨论】:

有些人可能认为这是一个缺点。专有扩展的存在是有原因的,通用的“为所有平台解决这个问题”的 ORM 必须根据定义忽略这些。

以上是关于插入 nhibernate sql server 后无法检索生成的 id的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server - 由于“ARITHABORT”,插入失败

SQL Server 简单插入语句超时

SQL Server Compact Edition 中的 NHibernate 期货

将 GUID 与 SQL Server 和 NHibernate 一起使用

将 sql server spatial 和 NHibernate 与 CreateSqlQuery 相结合

如何使用 NHibernate 处理来自 SQL Server 2008 的 TIME 数据类型?