使用保持身份递增的 NHibernate 映射我现有的 ID 列

Posted

技术标签:

【中文标题】使用保持身份递增的 NHibernate 映射我现有的 ID 列【英文标题】:Mapping my existing ID column using NHibernate that keeps identity incrementing 【发布时间】:2009-09-11 08:54:31 【问题描述】:

我正在学习 NHibernate 以学习比 linq to sql 更强大的 ORM,但我正在为一些简单的事情苦苦挣扎。

我的第一个挑战是使用 hbm.xml 映射此 ID 列。

CREATE TABLE [dbo].[Party](
   [Id] [int] IDENTITY(1,1) NOT NULL
 CONSTRAINT [PK_Party] PRIMARY KEY CLUSTERED 
(
[Id] ASC
) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

当我使用以下映射时,我得到一个奇怪的导出模式 DDL

   <class name="Party" table="Party">
     <id name="Id">
      <column name="Id" />
      <generator class="native" ></generator>
     </id>
   </class>

使用导出工具生成以下内容

create table Party (
    Id INT IDENTITY NOT NULL,
    primary key (Id)
)

使用 Nhibernate,如何添加集群主键和自增 Id?

或者,NHibernate 中的世界方式是让您的 db 架构与映射分离并使用 generator=native?

我开始认为 NHibernate 不应该用于模式生成,如果您已经有一个针对特定服务器进行了微调的数据库模式。

非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

我不明白。 你已经有了你的数据库,那么为什么要使用 NHibernate 来生成数据库的模式呢? 我只想为我的类创建映射,以便它们映射到现有的数据库模式?

我不知道是否可以在您的 NHibernate 映射中指定主键应该在聚集索引上,等等...因为这是 RDBMS 特有的。我猜聚集索引的概念对于 SQL Server 来说是非常特殊的。

【讨论】:

谢谢。我的目标是创建一个映射,而不是首先为我需要的所有 RDBMS 事物建模。 nhib 怎么知道 ID 列是由 DB 自动生成的? NHibernate 知道是因为您在类映射中指定的内容。例如,如果我指定: 那么它知道将其设为自动递增的身份字段。更多关于发电机的信息:barchitect.blogspot.com/2008/07/…【参考方案2】:

假设您正在使用 Microsoft SQL(看起来像)NHibernate 生成的模式 DDL将主键创建为聚集索引。

MSSQL 默认将主键创建为聚集索引(实际上,我认为它们总是聚集)。

【讨论】:

Cocawalla,您知道,是的,聚集索引是主键的默认设置,但这不是必需的。您可以选择其他一些索引作为聚集索引。

以上是关于使用保持身份递增的 NHibernate 映射我现有的 ID 列的主要内容,如果未能解决你的问题,请参考以下文章

使用自动映射时如何使用 Fluent NHibernate Validator?

自动增量(身份)在 Fluent NHibernate 中不起作用

如何使用 Fluent-NHibernate 和 MySQL 指定自动递增 (int) 标识列

没有身份的内部对象的简单映射

NHibernate在脚下射击:协会所有权和版本控制

使用 Fluent NHibernate 和 NHibernate 3 将枚举映射为 Int