0

我有一个问题,当我创建一些新实体时,ID 序列类似于 1001、2002、3003,......有时没有任何规则,如 1003 等等。

我希望每个表都有这样的顺序:1,2,3,4,5,...

我觉得问题始于新的 1.9.0.0 S#arp 项目。从 1.6.0.0 开发的项目或从 1.6.0.0 开始然后转换为 1.9.0.0 的项目都可以并且具有良好的顺序。

你知道哪里有问题吗?

我认为我必须在某个地方进行某些操作,但我不知道 S#arp 这么好我不知道,哪里可能是个问题。

4

2 回答 2

2

从它的外观看来,您目前正在使用 POID 生成器生成 ID。您可以在这篇文章中阅读所有相关信息:http: //nhforge.org/blogs/nhibernate/archive/2009/03/20 /nhibernate-poid-generators-revealed.aspx

现在从您提供的 ID 来看,它看起来像是在使用 HiLo 生成器,请阅读相同的内容.. 为您提供一个要点,每个 sessionFactory 都保留一个保留的 ID 集(可以定义),它可以分配和当它遍历所有 id 时,它会得到一个新集,并且下一个高值存储在相同 dB 的表中。因此,每次重新创建 sessionFactory 时,它都会得到一个新集,这就是为什么在你的 ids 中增加如果这个值为 1000 .. 我在Sharp Architecture wiki 中找到了一个参考:https ://github.com/sharparchitecture/Sharp-Architecture/wiki/HiLoGenerator并且看起来他们将它设置为 1000 ..

我猜你定义了一个类似的约定,这就是你看到这个的原因。

于 2012-06-16T07:58:03.457 回答
2

如果您想要一个不错的序列,那么我建议您将Id策略更改为身份。然而,这些类型的生成器有一些缺点,例如不允许批处理和破坏工作单元策略。

正如您所指出的, s#arp 使用的HILO策略不会受到上述缺点的影响。然而,一个缺点(实际上它不是一个缺点)是您Id's不是连续的(1001、1002、2001、2002、3003 等),因为每次构建会话工厂时都会HIhilo表中获取一个新的。当您多次构建项目时,这在您的开发机器上更为明显。在生产服务器上,随着会话工厂的重建更少,差距也更小。您也可以将 lo 减少到10而不是100减少差距!

IMO 内部 ID 是连续的并不重要,毕竟它们是内部的,对吗?此外,如果您删除记录,则无论如何都会出现间隙!

如果您的表id依赖于业务逻辑,那么 internalid's不是您的答案,也许您需要一个内部 id,然后是一个为您的业务逻辑提供唯一索引的列Id

我会问自己为什么您认为顺序内部 ID 很重要?希望您会意识到 if 实际上还不够重要而不必担心。

于 2012-06-16T09:21:50.330 回答