Fluent nhibernate fnhbernate、GeneratedBy.HiLo、hibernate\u unique\u键等

Fluent nhibernate fnhbernate、GeneratedBy.HiLo、hibernate\u unique\u键等,fluent-nhibernate,Fluent Nhibernate,我已经开始使用s#arp体系结构,它使用FNhibernate和GeneratedBy.HiLo生成主键(还有表hibernate_unique_key)。显然,这是推荐的做法,我想坚持下去。现在来谈谈我的问题。我经常使用NHibernate和hbm映射,并且通常使用标识列作为主键。这使我能够使用SQL为数据库设置种子。我可以用前面提到的设置(hibernate_unique_key table等)来完成这项工作吗。我需要这样做,因为SQL insert比使用NHibernate+C#为数据库添

我已经开始使用s#arp体系结构,它使用FNhibernate和GeneratedBy.HiLo生成主键(还有表hibernate_unique_key)。显然,这是推荐的做法,我想坚持下去。现在来谈谈我的问题。我经常使用NHibernate和hbm映射,并且通常使用标识列作为主键。这使我能够使用SQL为数据库设置种子。我可以用前面提到的设置(hibernate_unique_key table等)来完成这项工作吗。我需要这样做,因为SQL insert比使用NHibernate+C#为数据库添加一百万个实体要高效得多。如有任何反馈,将不胜感激。谢谢


Christian

我想问题在于pk的产生是由nhibernate控制的,而不是db。因此,一个选项是使用instance.GeneratedBy.Identity()。你认为这样做明智吗

如果您有任何意见,我将不胜感激


Christian

我想问题在于pk的产生是由nhibernate控制的,而不是db。因此,一个选项是使用instance.GeneratedBy.Identity()。你认为这样做明智吗

如果您有任何意见,我将不胜感激


Christian

您应该能够使用普通SQL为数据库种子,并且仍然使用HiLo在NHibernate中生成主键。您需要做的是将HiLo表中的NextHi值设置为足够高的值,以使您保存的下一个实体在为数据库设定种子时获得的id高于设置的最高id

因此,您应该能够执行以下操作:

  • 运行模式导出
  • 使用自定义sql脚本为数据库设定种子(您必须在脚本中提供自己的id,因为它们不是由数据库生成的)
  • 手动在hibernate_unique_key表中插入足够大的值,以便NHibernate生成的下一个id大于种子中插入的最大id
  • 像往常一样使用NHibernate
有几种不同的方法可以将HiLo与NHibernate一起使用(所有实体共享一个下一个hi,每个实体共享一个下一个hi,等等),因此您可能需要进行一些实验,以找出在种子设定后适合写入hibernate_unique_key表的值,取决于您的hilo策略和您使用的max_lo等

作为补充说明,模式导出似乎不支持hibernate_unique_key表中的多行,因此,如果每个实体使用hilo行,则可能需要手动创建表中的所有行

您还可以使用Identity生成ID,但代价是NHibernate的性能更差。性能损失的原因是NHibernate必须对每个插入进行额外读取,以获取数据库生成的id。对于hilo,NHibernate已经知道实体将获得的id,因此不需要额外读取


另一个选项是使用GuidComb,这也允许NHibernate生成id,因此无需在插入后查询数据库以获取id。但是,在开发时,您必须查看丑陋的guid,而不是漂亮的整数。:)

您应该能够使用普通SQL为数据库种子,并且仍然使用HiLo在NHibernate中生成主键。您需要做的是将HiLo表中的NextHi值设置为足够高的值,以使您保存的下一个实体在为数据库设定种子时获得的id高于设置的最高id

因此,您应该能够执行以下操作:

  • 运行模式导出
  • 使用自定义sql脚本为数据库设定种子(您必须在脚本中提供自己的id,因为它们不是由数据库生成的)
  • 手动在hibernate_unique_key表中插入足够大的值,以便NHibernate生成的下一个id大于种子中插入的最大id
  • 像往常一样使用NHibernate
有几种不同的方法可以将HiLo与NHibernate一起使用(所有实体共享一个下一个hi,每个实体共享一个下一个hi,等等),因此您可能需要进行一些实验,以找出在种子设定后适合写入hibernate_unique_key表的值,取决于您的hilo策略和您使用的max_lo等

作为补充说明,模式导出似乎不支持hibernate_unique_key表中的多行,因此,如果每个实体使用hilo行,则可能需要手动创建表中的所有行

您还可以使用Identity生成ID,但代价是NHibernate的性能更差。性能损失的原因是NHibernate必须对每个插入进行额外读取,以获取数据库生成的id。对于hilo,NHibernate已经知道实体将获得的id,因此不需要额外读取


另一个选项是使用GuidComb,这也允许NHibernate生成id,因此无需在插入后查询数据库以获取id。但是,在开发时,您必须查看丑陋的guid,而不是漂亮的整数。:)

可能有点晚了,但身份生成器将打破UnitOfWork模式

如果在当前会话上执行保存,它将尝试在DB中插入实体,从而破坏UoW的全部含义。 几个小时后,我找到了它损坏的原因,原因是这个身份生成器。我现在使用HiLo生成器

以下链接帮助我解决了这个问题:


可能有点晚了,但身份生成器将打破UnitOfWork模式

如果在当前会话上执行保存,则它将