C# 无NHibernate的NHibernate Hilo序列
我有一个应用程序,它使用NHibernate将实体保存到数据库中,并使用NHibernate的HiLo generate创建id。我有另一个应用程序,我需要将数据保存到同一个表中,但是在这个应用程序中,我没有使用NHibernate。有没有一种简单的方法可以在不添加对NHibernate和映射文件的引用的情况下使用HiLoC# 无NHibernate的NHibernate Hilo序列,c#,sql-server,nhibernate,.net-4.0,C#,Sql Server,Nhibernate,.net 4.0,我有一个应用程序,它使用NHibernate将实体保存到数据库中,并使用NHibernate的HiLo generate创建id。我有另一个应用程序,我需要将数据保存到同一个表中,但是在这个应用程序中,我没有使用NHibernate。有没有一种简单的方法可以在不添加对NHibernate和映射文件的引用的情况下使用HiLo <id name="EntityId" unsaved-value="0" > <column name="EntityId" sql-type="
<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>
休眠\u唯一\u键
下一个你好
1000
更新:我创建了一个新方法来获取下一个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;
}
}
//
///获取下一个实体id。
///
///
公共静态int GetNextAvailableEntityId()
{
int max_lo=1000;
int-nextHi=DefaultContext.Database.SqlQuery(“从hibernate\u unique\u key中选择next\u hi”).Single();
int nextRangeStart=max_lo*nextHi;
int currentMax=DefaultContext.Database.SqlQuery(“从实体中选择MAX(entityid)).Single();
如果(当前最大值
如果有疑问,请查看NH的代码,以确保正确实施
是这样的:
- 打开一个单独的事务,递增并读取下一个高值commit
- 通过下一个\u high*1000+x创建1000个ID
- 当ID用完时,请重新启动
您可以为同一进程的所有事务创建id生成器的单个实例。确保您的id生成器是线程安全的。我建议为HiLo列发布您的NH配置,以便给出准确的答案,而不是泛化。换句话说,您的参数值是什么?我更新了帖子以包含HiLo配置…只是为了确认,您对所有实体都使用相同的密钥表,
hibernate\u unique\u key
?您可以更新标题以使其更具体。这可能是一个常见的问题。谢谢。目前我正在研究这个问题:单独交易的部分并不明显。我希望我的回答能有所帮助。我上面的实现可能略有不同。所以当max_lo设置为1000时,NHibernate实际上保留了1000个Id。交易结束后,任何后续交易都有下千个可用值?不,不是交易有1000个可用值,整个流程(=应用程序)有1000个可用值。如果单个事务只需要一个值,则可以处理1000个事务,直到ID用完为止。这就是为什么要在单独的事务中更新hi-lo表。这将生成无间隙的增量数字,直到您重新启动应用程序。然后它将增加下一个hi(当然,只有在至少使用一个id时)。