我有一个应用程序使用NHibernate将实体保存到数据库,并且它使用HiLo生成NHibernate来创建id。我有另一个应用程序,我需要将数据保存到同一张表,但是在这个应用程序中,我没有使用NHibernate。有没有简单的方法来使用HiLo而无需添加对NHibernate和映射文件的引用?NHibernate Hilo序列没有NHibernate
<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配置发布给您的HiLo列,以便给出精确的答案,而不是泛化。换句话说,你的参数值是什么? http://stackoverflow.com/questions/2738671/please-explain-nhibernate-hilo/7084697#7084697 – Brook
我更新了帖子,包括HiLo配置... – mservidio
只是为了确认,你使用的是同样的密钥表, hibernate_unique_key'所有的实体? – Brook