我一直在閱讀nhibernate 3的初學者,並認爲我不應該通過MS Sql 2008使用自動ID,因爲這打破了工作單元(我正在執行的內容)。我應該使用Hilo還是Guid? +我如何使用Hilo
在這本書中,他們似乎建議希洛,但我仍然沒有真正得到他們,他們如何把一切都獨一無二。從我讀的內容來看,它就像id中的巨大差距,並且您可能需要更大的數據類型以防止使用所有組合(我目前使用的是int)。
所以其他的建議我看到的是什麼GUID不會有這個問題,但更難一點閱讀(如果你有比較的分貝手工的東西),而且需要一些更多的空間了。
所以現在我只是試圖讓一個示例項目,看看如何希洛的作品。
我買了2場(一個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與自動ID和一個HILO)。在其他兩張桌子有關係的地方,hilo桌子就像是在自己身邊一樣。
我需要爲它創建一個特殊的表格? – chobo2
如果您使用HiLo,是的。如果你從NHibernate導出模式,它會自動爲你創建它。 –
你是什麼意思從Nhibernate導出模式? – chobo2