将 GUID 与 SQL Server 和 NHibernate 一起使用

Posted

技术标签:

【中文标题】将 GUID 与 SQL Server 和 NHibernate 一起使用【英文标题】:Using GUID with SQL Server and NHibernate 【发布时间】:2010-10-06 15:57:14 【问题描述】:

我正在运行 NHibernate 和 SQL Server CE 我正在尝试使用 GUID 作为我的 ID 列。这是我已有的代码:

映射:

  <class name="DatabaseType" table="DBMON_DATABASE_TYPE">
    <id name="Id" column="DATABASE_TYPE_ID">
      <generator class="guid" />
    </id>
    <property name="DispName" />
  </class>

这是它创建的 create 语句:

create table DBMON_DATABASE_TYPE (
    DATABASE_TYPE_ID BIGINT not null,
   DispName NVARCHAR(255) null,
   primary key (DATABASE_TYPE_ID)
)

这是我希望能够在其上运行的那种插入语句:

Insert into DBMON_DATABASE_TYPE (DATABASE_TYPE_ID,DISPNAME) values ('f5c7181e-e117-4a98-bc06-733638a3a264','DOC')

这是我尝试时遇到的错误:

Major Error 0x80040E14, Minor Error 26306
> Insert into DBMON_DATABASE_TYPE (DATABASE_TYPE_ID,DISPNAME) values ('f5c7181e-e117-4a98-bc06-733638a3a264','DOC')
Data conversion failed. [ OLE DB status value (if known) = 2 ]

再一次,我的目标是能够使用 GUID 作为我的表的 ID 列,它们甚至不需要自动生成,我可以在 NHibernate 的 Save/SaveOrUpdate 方法中手动生成它们。如果您还有其他需要了解的信息,请告诉我!

【问题讨论】:

【参考方案1】:

在您的映射中,您需要确定您希望 NHibernate 在数据库架构中创建一个 GUID(看起来您正在从 nhibernate 映射生成您的架构)。在我的脑海中,以下应该可以工作:

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

【讨论】:

【参考方案2】:

而不是

DATABASE_TYPE_ID BIGINT not null,

应该是

DATABASE_TYPE_ID UNIQUEIDENTIFIER not null,

我强烈建议您使用NEWSEQUENTIALID() 作为默认值,因为您将它用作聚集索引,因为它不会导致页面拆分和碎片,请参阅此处如何使用它http://msdn.microsoft.com/en-us/library/ms189786.aspx

【讨论】:

如果在客户端生成 ID,请使用 Guid.Comb。如果数据库正在生成 ID,请使用 NewSequentialID。 Comb 单元仅在客户端的单个实例运行时才能正常工作。当您需要在多个盒子上运行时,您还可以在客户端分配 GUId.NewGuid。【参考方案3】:

我敢推荐使用 GuidComb 代替吗?

【讨论】:

以上是关于将 GUID 与 SQL Server 和 NHibernate 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

sql如何将新产生的guid和一条其他表的数据插入当前表

SQL Server Int 主键和 Guid

根据SQL Server排序规则创建顺序GUID

sql 获取当前插入的主键 表主键是guid类型的

如何配置 EF Core 5 以使 MS SQL Server 数据库生成 Guid 密钥

如何生成与 Advantage Database Server 格式相同的 GUID 字符串?