Nhibernate id’;具有连续一步递增id的s’;s(HiLo的替代方案)

Nhibernate id’;具有连续一步递增id的s’;s(HiLo的替代方案),nhibernate,orm,hilo,Nhibernate,Orm,Hilo,我如何指示Nhibernate生成连续的一步主键,如sql生成的主键 当前的HiLo算法生成4001、5010、6089等密钥。我知道这是为了管理多个应用服务器等,但我没有这个问题。 我需要nhibernate在启动期间获取最高的记录集值(比如15),然后使用主键16生成下一条记录(非常类似于从sql端生成的id) 你为什么需要/期望NHibernate为你做这件事 NHibernate很难为这样的场景提供通用的解决方案,因为需求可能会有微小的变化,但由于您确切地知道自己的特定约束,因此提供自己

我如何指示Nhibernate生成连续的一步主键,如sql生成的主键

当前的HiLo算法生成4001、5010、6089等密钥。我知道这是为了管理多个应用服务器等,但我没有这个问题。

我需要nhibernate在启动期间获取最高的记录集值(比如15),然后使用主键16生成下一条记录(非常类似于从sql端生成的id)

你为什么需要/期望NHibernate为你做这件事

NHibernate很难为这样的场景提供通用的解决方案,因为需求可能会有微小的变化,但由于您确切地知道自己的特定约束,因此提供自己的解决方案(使用手动分配的ID)应该相对简单

在应用程序启动时,查询数据库并获取当前最大id值。每次执行插入操作时增加该值。

创建表格:

CREATE TABLE `seq` (
  `ID` varchar(10) COLLATE utf8_unicode_ci NOT NULL,
  `HI` bigint(20) unsigned NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO `seq` VALUES ('COMMENT', '0');
INSERT INTO `seq` VALUES ('POST', '0');
INSERT INTO `seq` VALUES ('USER', '0');
使用FluentNHbiernate添加如下映射:

    public class Comment_Map : ClassMap<Comment>
    {
        public Comment_Map()
        {
            Table("COMMENT");

            Id(x => x.ID, "ID").GeneratedBy.HiLo("SEQ", "HI", "0", o => o.AddParam("where", "ID = 'COMMENT'"));
        }
     }
公共类注释\u映射:类映射
{
公众评论(地图)
{
表(“评论”);
Id(x=>x.Id,“Id”).GeneratedBy.HiLo(“SEQ”,“HI”,“0”,o=>o.AddParam(“where”,“Id='COMMENT”);
}
}

为什么不使用db生成的id?@Mattias我没有阅读整篇文章,如果我没有抓住要点,我很抱歉。但是使用hilo的常见原因是为了减少网络流量。如果你真的想让你的id井然有序,你每次都必须去db,所以用它代替db生成的id没有什么实际意义。这可以通过hilo完成(只需将maxlo设置为0)。但是这没有任何意义,因为你会得到很多流量。问题不在于多个应用程序使用同一数据库。是指多个用户使用同一应用程序。如果您和我同时试图保存某些内容,那么我们将发生冲突。@Mattias难道没有一个生成器在启动时将最大值调出一次,然后在内存中保持最大值,每次分配时都将其递增。是的,但它只保留与您设置的最大值一样多的id吗。因此,如果将其设置为0,它将只保留1个id,并在需要更多id时立即转到db。这就是为什么在使用hilo时会得到非顺序id,因为您保留了一些id,但只使用了其中的几个。它不能在内存中增加,也不能保存到数据库中,因为当有多个用户时,这意味着会有问题。@dmonlord,将maxLo设置为0,基本上消除了首先使用hilo的优势。通过这种方式,您将获得大量的网络流量,使用db生成的id可能会更好。我知道,但这正是他想要的。如果您不想实现自己的生成器,可能没有任何好的替代方法。@dmonlord,我知道没有替代方法。我刚刚指出,之所以使用hilo(或任何客户端生成的id),是因为您希望减少网络流量。有了你的解决方案,你最终会得到更多的网络流量。@Quintin-那篇博文并没有告诉我任何我不知道的事情。我不知道你为什么选择这个作为对我答案的评论?