如何在 NHibernate 中自动生成 ID

How to auto generate IDs in NHibernate

如何让 NHibernate 为 table 自动生成唯一 ID? ID 可以是任何 long 值,只要每个值只使用一次即可。

我当前的映射如下所示:

<id name="Id">
    <generator class="increment"/>
</id>

这会创建从 1 开始递增的 ID,但会在每次应用程序启动时重置为 1。因此每次重启后,存储的第一个元素将获得 Id 1 并且之前的 Id 1 元素将被删除(不是我想要的)。

编辑:这样做的原因是我使用了 SchemaExport 而不是 SchemaUpdate,所以我的整个数据库在每次应用程序启动时都被删除了。

谢谢!

关于它有明确的文档部分。我建议使用 HI-LO(参见 What's the Hi/Lo algorithm?

5.1.5.1. generator

增量

生成任何整数类型的标识符,只有当没有其他进程将数据插入同一 table 时,这些标识符才是唯一的。不要在集群中使用。

身份

支持 DB2、MySQL、MS SQL Server 和 Sybase 中的标识列。数据库返回的标识符使用 Convert.ChangeType 转换为 属性 类型。因此支持任何整数 属性 类型。

序列

使用 DB2、PostgreSQL、Oracle 中的序列或 Firebird 中的生成器。数据库返回的标识符使用 Convert.ChangeType 转换为 属性 类型。因此支持任何整数 属性 类型。

希洛

使用 hi/lo 算法有效地生成任何整数类型的标识符,给定 table 和列(默认分别为 hibernate_unique_key 和 next_hi)作为源的喜值。 hi/lo 算法生成仅对特定数据库唯一的标识符。不要将此生成器与用户提供的连接一起使用。

您可以使用 "where" 参数指定要在 table 中使用的行。如果你想为你的标识符使用一个单独的表格,每个 table 有不同的行,这很有用。

seqhilo

使用 hi/lo 算法在给定命名数据库序列的情况下有效地生成任何整数类型的标识符。

uuid.hex

使用System.Guid及其ToString(字符串格式)方法生成字符串类型的标识符。返回字符串的长度取决于配置的格式。

uuid.string

使用新的 System.Guid 创建一个转换为字符串的 byte[]。 向导

使用新的 System.Guid 作为标识符。

guid.comb

使用 Jimmy Nilsson 在文章 http://www.informit.com/articles/article.asp?p=25862 中描述的算法生成新的 System.Guid。

原生

根据底层数据库的功能选择标识、序列或 hilo。

已分配

让应用程序在调用 Save() 之前为对象分配一个标识符。

外国

使用另一个关联对象的标识符。通常与 <one-to-one> 主键关联一起使用。