【问题标题】:Nhibernate Identity mapping when using "newsequentialid" in DB在 DB 中使用“newsequentialid”时的休眠身份映射
【发布时间】:2012-05-24 08:08:12
【问题描述】:

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

现在我想要的是,当插入新的附件时,NHibernate 将允许 SQL Server 使用 newsequentialid 创建 Guid。问题是我在尝试保存未设置 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 使用生成器类设置为原生。

提前感谢所有帮助! :)

【问题讨论】:

    标签: c# sql sql-server nhibernate hbm


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      截至 2013 年 6 月 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

      【讨论】:

      • 我尝试创建一个并不难的自定义生成器,但是要获得 NEWSEQUENTIALID 的最后一个值,您必须创建一个临时表,所以我认为这是一个矫枉过正的做法。我决定只使用 GuidComb,我读到它是一个 GUID,但有一个序列。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多