gpt4 book ai didi

c# - 没有 NHibernate 的 NHibernate Hilo 序列

转载 作者:行者123 更新时间:2023-11-30 12:15:29 25 4
gpt4 key购买 nike

我有一个使用 NHibernate 将实体保存到数据库的应用程序,它使用 NHibernate 的 HiLo 生成器来创建 id。我有另一个应用程序,我需要将数据保存到同一个表中,但是在这个应用程序中,我没有使用 NHibernate。有没有一种简单的方法可以在不添加对 NHibernate 和映射文件的引用的情况下使用 HiLo?

<id name="EntityId" unsaved-value="0" >
<column name="EntityId" sql-type="int" not-null="true" />
<generator class="hilo">
<param name="table">hibernate_unique_key</param>
<param name="column">next_hi</param>
<param name="max_lo">1000</param>
</generator>
</id>

更新:我创建了一个新方法来获取下一个 id,我认为它与 NHibernate HiLo 序列具有相同的行为。我没有在数据库上加任何锁,所以如果这是我插入的高频表,那可能是个问题,但对于非常低的频率,出现并发问题的可能性非常低.

/// <summary>
/// Gets the next entity id.
/// </summary>
/// <returns></returns>
public static int GetNextAvailableEntityId()
{
int max_lo = 1000;
int nextHi = DefaultContext.Database.SqlQuery<int>("select next_hi from hibernate_unique_key").Single();
int nextRangeStart = max_lo * nextHi;
int currentMax = DefaultContext.Database.SqlQuery<int>("SELECT MAX(entityid) FROM Entities").Single();

if (currentMax < nextRangeStart)
{
return currentMax + 1;
}
else
{
DefaultContext.Database.ExecuteSqlCommand("update hibernate_unique_key set next_hi = next_hi + 1");
return nextHi;
}
}

最佳答案

如有疑问,请查看 NH 的代码以确保您正确实现了它。

是这样的:

  • 打开一个单独的事务,递增并读取下一个高值,提交
  • 通过 next_high * 1000 + x 创建 1000 个 ID
  • 当你用完所有 id 时,重新开始

您可以为同一进程的所有事务创建一个 ID 生成器的单个实例。确保您的 ID 生成器是线程安全的。

关于c# - 没有 NHibernate 的 NHibernate Hilo 序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7284712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com