Nhibernate 我应该使用Hilo还是Guid+;如何使用Hilo

Nhibernate 我应该使用Hilo还是Guid+;如何使用Hilo,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我一直在阅读nhibernate 3初学者版,我发现我不应该通过MS Sql 2008使用auto id,因为这会破坏工作单元(我正在实现的) 在书中,他们似乎推荐Hilo,但我仍然没有真正理解他们,以及他们如何保持每件事的独特性。从我所读到的内容来看,它在id中造成了巨大的缺口,您可能需要更大的数据类型来防止它使用所有的组合(我目前正在使用int) 因此,我看到的另一个建议是GUID what,它不会有这个问题,但更难阅读(如果您需要在db中手动比较某些内容),并且占用更多的空间 所以现在我只

我一直在阅读nhibernate 3初学者版,我发现我不应该通过MS Sql 2008使用auto id,因为这会破坏工作单元(我正在实现的)

在书中,他们似乎推荐Hilo,但我仍然没有真正理解他们,以及他们如何保持每件事的独特性。从我所读到的内容来看,它在id中造成了巨大的缺口,您可能需要更大的数据类型来防止它使用所有的组合(我目前正在使用int)

因此,我看到的另一个建议是GUID what,它不会有这个问题,但更难阅读(如果您需要在db中手动比较某些内容),并且占用更多的空间

所以现在我只是想做一个示例项目,看看hilo是如何工作的

我得到了一个包含2个字段的简单表(一个pk和一个varchar)


现在在我的数据库中有3个表(2个带有自动id,1个带有hilo)。hilo表本身是浮动的,其他两个表之间有关系。

关于hilo的解释,我读过的最简单、最简洁的是

对于不起作用的示例,您缺少hibernate_unique_key表(默认名为Hilo表)


修复它的最简单方法是让NHibernate为您创建它-将NHibernate配置上的SchemaAutoAction属性设置为“Update”

您需要创建HiLo表


我通常使用Guid.Comb,因为这对我来说比较容易,因为我通常与不了解HiLo的其他系统共享同一个数据库

我需要为它创建一个特殊的表?如果使用HiLo,可以。如果您从NHibernate导出架构,它将自动为您创建它。从NHibernate导出架构是什么意思?
  public class HiLo
    {
        public virtual int Id { get; set; // not sure if this should be a private set. I see it both ways }
        public virtual string Title { get; set; }
    }


public class HiLoMapping : ClassMap<HiLo>
{
    public HiLoMapping()
    {
        Id(x => x.Id).GeneratedBy.HiLo("100");
        Map(x => x.Title);
    }
}
NHibernate.Exceptions.GenericADOException was caught
  Message=could not get or update next value[SQL: ]
  Source=NHibernate
  StackTrace:
       at NHibernate.Engine.TransactionHelper.Work.DoWork(IDbConnection connection, IDbTransaction transaction)
       at NHibernate.Transaction.AdoNetTransactionFactory.ExecuteWorkInIsolation(ISessionImplementor session, IIsolatedWork work, Boolean transacted)
       at NHibernate.Transaction.AdoNetWithDistributedTransactionFactory.ExecuteWorkInIsolation(ISessionImplementor session, IIsolatedWork work, Boolean transacted)
       at NHibernate.Engine.Transaction.Isolater.DoIsolatedWork(IIsolatedWork work, ISessionImplementor session)
       at NHibernate.Engine.TransactionHelper.DoWorkInNewTransaction(ISessionImplementor session)
       at NHibernate.Id.TableGenerator.Generate(ISessionImplementor session, Object obj)
       at NHibernate.Id.TableHiLoGenerator.Generate(ISessionImplementor session, Object obj)
       at NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
       at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)
       at NHibernate.Event.Default.DefaultSaveEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)
       at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event)
       at NHibernate.Event.Default.DefaultSaveEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event)
       at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event)
       at NHibernate.Impl.SessionImpl.FireSave(SaveOrUpdateEvent event)
       at NHibernate.Impl.SessionImpl.Save(Object obj)
       at unitofwork.Models.Repository.StoreRepo.Create(HiLo hilo) in ]StoreRepo.cs:line 32
       at unitofwork.Models.Service.StoreService.CreateStore() inStoreService.cs:line 33
  InnerException: System.Data.SqlClient.SqlException
       Message=Invalid object name 'hibernate_unique_key'.
       Source=.Net SqlClient Data Provider
       ErrorCode=-2146232060
       Class=16
       LineNumber=1
       Number=208
       Procedure=""
       Server=(local)
       State=1
       StackTrace:
            at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
            at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
            at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
            at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
            at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
            at System.Data.SqlClient.SqlDataReader.get_MetaData()
            at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
            at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
            at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
            at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
            at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
            at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
            at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()
            at NHibernate.Id.TableGenerator.DoWorkInCurrentTransaction(ISessionImplementor session, IDbConnection conn, IDbTransaction transaction)
            at NHibernate.Engine.TransactionHelper.Work.DoWork(IDbConnection connection, IDbTransaction transaction)
       InnerException: