将 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 一起使用的主要内容,如果未能解决你的问题,请参考以下文章