是否有从标识列迁移到hilo键的实用方法?

Jac*_*yan 15 nhibernate identity sequence hilo

我使用的数据库严重依赖于标识列.但是,由于我们现在已将所有应用程序移至NHibernate,因此我希望使用HiLo,因为似乎建议使用NHibernate.是否有任何策略可以做到这一点,或者需要注意哪些常见问题?

Ste*_*ger 14

您需要设置NH使用的表格才能正确创建HiLo值.让Schema Creator根据您的映射定义创建表,根据数据库中id的当前状态设置值.

我相信(你需要验证这一点)hilo生成的值是通过以下公式计算的:

hilo-id = high-value * max_lo + low-value
Run Code Online (Sandbox Code Playgroud)

虽然高值存储在数据库中,但max_low在映射文件中定义,而低值在运行时计算.


NHibernate还需要自己的连接和事务来确定和增加高值.因此,如果应用程序提供连接,则它不起作用.

您仍然可以使用seqhilo,NH使用数据库序列来创建下一个高值,并且不需要单独的连接来执行此操作.这仅适用于支持序列的数据库,如Oracle.


更正:

与此同时,我必须自己实施(之前,它只是理论:-).所以我回来分享细节.

公式是:

next_hi = (highest_id / (maxLow + 1)) + 1
Run Code Online (Sandbox Code Playgroud)

next_hi是您需要更新的数据库中的字段.highest_id是数据库中找到的最高ID.maxLow是您在映射文件中指定的值.不知道为什么它会增加一个.除法是整数分割,它截断小数位.


UpT*_*eek 8

如果这是一个关于将现有应用程序迁移到以前使用过自动ID的hilos的问题,并且其中有旧数据需要迁移...那么这将是我最好的选择(尽管不尝试! - 欢迎评论!) :

  • 将列类型ID更改为bigints
  • 找出当前任何表中的最高id值.
  • 将hilo源表中的"next-high"值设置为高于ID中的值

如果当然这只解决了标识列的问题,而不是在您将应用程序移动到NHibernate时可能需要更改的架构中的任何其他内容.