如何在NHibernate中自动生成ID

时间:2015-12-11 09:09:30

标签: c# postgresql nhibernate nhibernate-mapping

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

我当前的映射如下所示:

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:6)

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

5.1.5.1. generator

<强>增量

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

<强>身份

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

<强>序列

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

<强>希洛

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

您可以使用“where”参数指定要在表中使用的行。如果要为标识符使用单个表格,并为每个表使用不同的行,则此选项非常有用。

<强> seqhilo

在给定命名数据库序列的情况下,

使用hi / lo算法有效地生成任何整数类型的标识符。

<强> uuid.hex

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

<强> uuid.string

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

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

<强> guid.comb

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

<强>天然

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

<强>分配

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

<强>外国

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