2011-09-13 27 views
2

我一直在閱讀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桌子就像是在自己身邊一樣。

回答

1

對於高住低訓的解釋,我讀過的最簡單,最簡潔的一個是What's the Hi/Lo algorithm?

至於你的例子不工作,你錯過的是hibernate_unique_key表(即名爲希洛表中的默認值)。

解決它最簡單的方法,是讓NHibernate的去創造你 - 設置NHibernate的配置,以「更新」的SchemaAutoAction屬性。

+0

我需要爲它創建一個特殊的表格? – chobo2

+1

如果您使用HiLo,是的。如果你從NHibernate導出模式,它會自動爲你創建它。 –

+1

你是什麼意思從Nhibernate導出模式? – chobo2

1

您需要創建希洛表,check it here

我通常Guid.Comb工作,因爲它更容易我,因爲我通常共享與其他系統相同的數據庫,不知道希洛