我一直在为初学者阅读nhibernate 3,我发现我不应该通过MSSQL2008使用自动id,因为这会破坏工作单元(我正在考虑实现的)。
在书中,他们似乎推荐了希洛,但我仍然没有真正理解他们,以及他们是如何保持一切独特的。据我所知,它在id中造成了巨大的差距,你可能需要更大的数据类型来防止它使用所有的组合(我目前正在使用int)。
所以我看到的另一个建议是GUID,它不会有这个问题,但更难阅读(如果你必须在数据库中手动比较一些东西),并占用更多的空间。
所以现在我只想做一个样例项目,看看hilo是如何工作的。
我得到了一个包含两个字段的简单表(一个pk和一个varchar)
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);
}
}不确定100实际上是什么意思,但它不起作用。
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: 现在在我的数据库中,我有3个表(2个带有auto id,一个带有hilo)。hilo表在某种程度上是独立浮动的,而其他两个表有一个关系。
发布于 2011-09-14 04:37:09
关于HiLo的解释,我读过的最简单、最简洁的是What's the Hi/Lo algorithm?。
至于您的示例不起作用,您缺少hibernate_unique_key表(这是默认的名称为Hilo表)。
修复它的最简单的方法是让NHibernate为你创建它--将Nhibernate配置上的SchemaAutoAction属性设置为“Update”。
发布于 2011-09-14 06:27:29
您需要创建HiLo表check it here
我通常使用Guid.Comb,因为我通常与另一个不了解HiLo的系统共享同一个数据库,所以对我来说更容易
https://stackoverflow.com/questions/7405811
复制相似问题