我正在使用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;不是公认的内置函数名称。]
答案 0 :(得分:0)
NHibernate (一般是ORM)的真正重要优势在于我们不必解析当前使用的数据库引擎的特定SQL语法。如果我们设法使用NHibernate的标准化API - 我们几乎可以针对任何数据库引擎运行我们的代码。唯一重要的设置是 DIALECT ,它允许NHibernate正确地将其转换为与数据库引擎相关的SQL:
您应该始终将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>