c# - NHibernate seqhilo 如何生成 id?

标签 c# oracle nhibernate nhibernate-mapping

我的 Oracle 数据库有一个从 1,000,000,000 开始的序列 (PART_SEQ)。我的 NHibernate 映射使用此序列通过 seqhilo 生成 ID。

  <id name="_persistenceId" column="Id" type="long" access="field" unsaved-value="0" >
     <generator class="seqhilo" >
        <param name="sequence">part_seq</param>
        <param name="max_lo">100</param>
     </generator>
  </id>

我希望生成 id,如 100000000000、100000000001、100000000002、...、100000000100、100000000101、100000000102、... 基于 this questionthis question .

相反,NHibernate 正在生成诸如 101000000000、101000000001、101000000002、...、101000000100、101000000101、101000000102 以及额外的 1 之类的 ID。它是如何生成这些 ID 的,我怎样才能让它不添加额外的 1 ?

最佳答案

查看源代码here ,算法的实现将 max_lo 值加 1,然后将其乘以序列以生成 hi 部分。然后将 lo 部分添加到此结果以创建最终 ID。

对于问题中的示例,它将以下列方式生成 id:

//max_lo is set to 100 when the generator is initialized

if(lo > max_lo)
{
    lo = 1;
    sequence = GetNextSequenceNumber(...);  //Starts at 1 billion
    hi = sequence * (max_lo + 1);
}
returnVal = hi + lo++;

创建 101000000001、101000000002、101000000003 等

关于c# - NHibernate seqhilo 如何生成 id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6377968/

相关文章:

c# - 如何创建一个包含数字数组和字符串数组的随机类

c# - 转换大型 Xml 文件

sql - sql 加载器中 select 语句的问题

sql - Oracle 中的 XML 查询

Oracle SQL Developer - 导航 Pane 中缺少节点 "tables"

nhibernate - 使用 Fluent Nhibernate 映射带有参数的 nhibernate 自定义类型

nhibernate - 我在我的第一个(流利的)nhibernate 查询中收到错误 Initializing[type]-failed... no session or session was closed

c# - 如何阻止 ToolStripMenuItem 下拉菜单在选择项目时自行删除?

c# - 我可以传入 T.Property 吗?另外,改进这种方法的想法?

c# - 在加载了 firefox 插件的 selenium 中打开 firefox 窗口?