Fluent nhibernate 流利的NHibernate—;使用HiLo生成器时类/实体特定的下一个\u hi种子

Fluent nhibernate 流利的NHibernate—;使用HiLo生成器时类/实体特定的下一个\u hi种子,fluent-nhibernate,hilo,Fluent Nhibernate,Hilo,基本上,我正在尝试做同样的事情,但与流利的NHibernate 以下是我的id生成约定: public class IdGenerationConvention : IIdConvention { public void Apply(IIdentityInstance instance) { instance.GeneratedBy.HiLo("1000"); }

基本上,我正在尝试做同样的事情,但与流利的NHibernate

以下是我的id生成约定:

    public class IdGenerationConvention : IIdConvention
    {
            public void Apply(IIdentityInstance instance)
            {
                    instance.GeneratedBy.HiLo("1000");
            }
    }
现在这很好,但所有类最终都使用相同的
next\u hi

    create table hibernate_unique_key (
            next_hi INTEGER 
    )
有人知道如何指定每个类下一步应该使用自己的


为了澄清,我想以类似于
customer\u next\u hi
order\u next\u hi
的内容结束,假设它基于列工作。如果它是基于行的,那么这也没关系,前提是每个实体都知道它的
下一个值使用哪一行。

我在Fluent NHibernate Google Group中也问过这个问题,似乎唯一的方法是创建一个自定义id生成器类,该类可以从HiLo或TableGenerator继承。据我所知,关键问题是创建种子表的SQL语句只执行一次,并且没有内置的覆盖或钩子来让它创建特定于实体的列或行


因此,我需要做的是一些类似的事情。一旦我有了一个有效的实现,我将再次发布。

有趣的问题,但我想知道你为什么要这么做?在(相当小的)缺点上,您将生成更多的db请求。从好的方面看,您将通过某种因素增加代理ID空间。但是,对于所有的组合来说,长/粗不够吗?(最多18446744073709551615个ID!)

在Anthony Dewhert的博客上发布了一个很好的解决方案:

有趣的概念。一旦它开始工作,我肯定很想看一看。一定要发回!迄今为止最大的PITA是提前确定所有实体列。链接的解决方案依赖于“allcolumns”参数,您可以在该参数中指定所需的各种种子列。不过我希望它更具活力。在大多数情况下,我同意,没有太多的收益可以获得,这属于“如果它没有破产”的范畴。不过,为了回答您的问题,我认为其中的一部分是在每个实体的基础上增加IDs(对于添加两个客户之间添加1000个订单的情况)。我承认的另一部分只是看看如何做到这一点是的,我明白你关于订单号的意思。然而,有一种学派认为,代理密钥不应在应用程序之外具有任何用途或意义(即ID字段不应同时用作代理密钥和订单号)。将ID用于这两个目的的另一个问题是,如果您必须重新考虑您的数据库方法(例如在扩展时),并且需要使用不同的关键策略(但仍然保留旧记录)。嗯,这很有意义,我认为这些都是非常有效的观点。我仍然会尝试让它工作,如果没有其他原因,只是为了更好地了解内部的工作原理。