在数据库中使用“newsequentialid”时的Nhibernate身份映射
本文关键字:时的 Nhibernate 身份 映射 newsequentialid 数据库 | 更新日期: 2023-09-27 18:35:15
我正在使用NHibernate将我的对象映射到数据库。其中一个对象称为"附件"。它的 ID 是使用 MS SQL Server 2008 中的"newsequentialid"(作为默认值或绑定)生成的,以便为 id 列创建 Guid。
现在我想要的是,当插入新的附件时,NHibernate将允许SQL Server使用newsequentialid创建Guid。问题是,在尝试保存未设置 id 的新附件时,i 不断收到异常"空标识符"(Guid.Empty)
这是我的 HBM 文件:
<class name="DataObjects.Services.NHAttachment, DataObjects, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" mutable="false" table="Attachments">
<id name="Id" column="Guid" type="Guid" >
<generator class="native" />
</id>.....
如您所见,ID 是使用生成器类设置为本机的。
提前感谢所有帮助!! :)
如果你想告诉NHibernate在数据库架构中创建GUID,那么我认为以下内容应该有效:
<id name="Id" column="Guid" type="Guid">
<generator class="guid" />
</id>
截至 2013-06-12,NHibernate 3.3 似乎不能正确支持 NEWSEQUENTIALID,因为我尝试过它并且失败了。
例如,有
sec_UserRole
(UserRoleId UNIQUEIDENTIFIER DEFAULT NewSequentialId(),
UserId,
RoleId,
CreationDate,
CreatedBy)
带映射
public SecUserRoleMapping()
{
Table("sec_UserRole");
Id(x => x.UserRoleId, m => m.Generator(Generators.Native);
我得到以下 SQL:
declare @p0 uniqueidentifier
declare @p1 uniqueidentifier
declare @p2 datetime2
declare @p3 uniqueidentifier
set @p0 = '00000000-0000-0000-0000-000000000001'
set @p1 = '383b75fd-6829-41b5-b8a6-63f1dc1acef0'
set @p2 = '12/6/2013 5:09:56 AM'
set @p3 = '00000000-0000-0000-0000-000000000001'
INSERT
INTO
sec_UserRole
(UserId, RoleId, CreationDate, CreatedBy)
VALUES
(@p0, @p1, @p2, @p3);
**select
SCOPE_IDENTITY();**
请注意 ** 突出显示的部分。它试图获得最后一个身份!当它应该使用 OUTPUT 子句并使用输出参数获取它时。http://jwwishart.wordpress.com/2009/08/05/returning-the-newsequentialid-after-insert-using-the-output-clause/
所以我的下一步是尝试创建一个新的自定义生成器。http://nhibernate.info/doc/howto/various/creating-a-custom-id-generator-for-nhibernate.html