在DB中使用“newsequentialid”时的Nhibernate标识映射

时间:2012-05-24 08:08:12

标签: c# sql sql-server nhibernate hbm

我使用NHibernate将我的对象映射到数据库。其中一个对象称为"附件"。它的ID是使用" newsequentialid"生成的。在MS SQL Server 2008中(作为默认值或绑定)为id列创建Guid。

现在我想要的是,当插入新的附件时,NHibernate将允许SQL Server使用newsequentialid创建Guid。事情就是我不断获得异常" null标识符"在尝试保存未设置id的新附件时(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是使用生成器类设置的。

提前感谢所有帮助!! :)

2 个答案:

答案 0 :(得分:0)

如果你想告诉NHibernate在数据库模式中创建一个GUID,那么我认为以下内容应该有效:

<id name="Id" column="Guid" type="Guid">
  <generator class="guid" />
</id>

答案 1 :(得分:0)

截至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