Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无NHibernate的NHibernate Hilo序列_C#_Sql Server_Nhibernate_.net 4.0 - Fatal编程技术网

C# 无NHibernate的NHibernate Hilo序列

C# 无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="

我有一个应用程序,它使用NHibernate将实体保存到数据库中,并使用NHibernate的HiLo generate创建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>

休眠\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时)。