【问题标题】:Using GUID with SQL Server and NHibernate将 GUID 与 SQL Server 和 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 方法中手动生成它们。如果您还有其他需要了解的信息,请告诉我!

【问题讨论】:

    标签: asp.net sql nhibernate sql-server-ce guid


    【解决方案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 代替吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-15
        • 1970-01-01
        • 1970-01-01
        • 2012-03-26
        相关资源
        最近更新 更多