我有一个应用程序,它使用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;
}
}发布于 2011-09-02 22:41:44
如果有疑问,请查看NH的代码,以确保正确实现它。
它是这样的:
您可以为同一进程的所有事务创建id生成器的单个实例。确保你的id生成器是线程安全的。
https://stackoverflow.com/questions/7284712
复制相似问题