【问题标题】:How to auto generate IDs in NHibernate如何在 NHibernate 中自动生成 ID
【发布时间】:2016-03-17 03:24:16
【问题描述】:

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

我当前的映射如下所示:

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

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

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

谢谢!

【问题讨论】:

    标签: c# postgresql nhibernate nhibernate-mapping


    【解决方案1】:

    有关于它的明确文档部分。我建议使用 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 format) 方法生成字符串类型的标识符。返回的字符串长度取决于配置的格式。

    uuid.string

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

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

    guid.comb

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

    原生

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

    已分配

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

    外国

    使用另一个关联对象的标识符。通常与&lt;one-to-one&gt; 主键关联一起使用。

    【讨论】:

    • 增量生成器不应该生成唯一ID吗?我不喜欢 hilo 生成器,因为据我了解,它需要两个额外的列。
    • 老实说,我的经验是,增量工作正常。它不会在应用程序重新启动时从 1 开始。它获取最后一个最大值并继续递增它。所以,也许你没有遇到那种问题,而是别的问题。但。增量仅在单线程世界中是好的(非常独特的情况) HI-LO 始终是安全的,但您必须准备好接受非线性 ID...某些数字将被跳过。希望这会有所帮助...
    • 我使用的是SchemaExport而不是SchemaUpdate,这就是为什么我在应用程序启动时丢失了我的数据库。我现在按照您的建议使用 Hilo,效果很好!
    • 很高兴看到这一点,真的。享受 NHibernate ;)
    猜你喜欢
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 2021-11-08
    • 2011-01-11
    • 1970-01-01
    相关资源
    最近更新 更多