2010-10-06 49 views
0

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

映射:

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

这是创建语句它创建:

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

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

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的的保存/ SaveOrUpdate方法手动生成它们。如果有任何其他信息需要了解,请告诉我!

回答

1

在您的映射中,您需要确定您希望NHibernate能够在数据库模式中使用GUID(它看起来像是通过nhibernate映射生成模式)。关闭我的头顶下面应该工作:

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

代替

DATABASE_TYPE_ID BIGINT not null, 

它需要

DATABASE_TYPE_ID UNIQUEIDENTIFIER not null, 

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

+1

如果在客户端生成ID,则使用Guid.Comb。如果数据库正在生成ID,请使用NewSequentialID。 – 2010-10-06 16:10:53

+0

当单个客户端实例正在运行时,梳子单元只能很好地工作。当您需要在多个框上运行时,您还可以在客户端分配GUid.NewGuid。 – Paco 2010-10-06 19:29:47

1

敢我推荐使用GuidComb的?