2012-02-20 66 views
4

我一直在嘗試與nhibernate一起使用臨時表。爲什麼臨時表不能在nhibernate中工作?

下面這段代碼不起作用

query = @"CREATE TABLE [#Dataset_x] 
      ([Name] [nvarchar](max) NULL, 
      [Value] [nvarchar](max) NULL)"; 
Session.CreateSQLQuery(query).SetTimeout(uploadExecQueryTimeout).ExecuteUpdate(); 

query = @"INSERT INTO [#Dataset_x] ([Name],[Value]) VALUES('Dataset','MyDataset')"; 
Session.CreateSQLQuery(query).SetTimeout(uploadExecQueryTimeout).ExecuteUpdate(); 

而且我得到的對象無效的錯誤,當我嘗試運行第二個查詢(因爲創建過期之前,我在第二個叫做臨時表查詢)。

但是,如果我在以下所示的事務下添加上面的代碼片段,它的工作原理非常好。

using (var transaction = Session.BeginTransaction()) 
{ 
    query = @"CREATE TABLE [#Dataset_x] 
       ([Name] [nvarchar](max) NULL, 
       [Value] [nvarchar](max) NULL)"; 

    Session.CreateSQLQuery(query).SetTimeout(uploadExecQueryTimeout).ExecuteUpdate(); 

    query = @"INSERT INTO [#Dataset_x] ([Name],[Value]) VALUES('Dataset','MyDataset')"; 
    Session.CreateSQLQuery(query).SetTimeout(uploadExecQueryTimeout).ExecuteUpdate(); 
    transaction.Commit(); 
} 

任何人都可以建議我爲什麼事務需要在nhibernate中使用臨時表嗎?

注:這是我在我的配置中使用的「current_session_context_class」值調用

回答

4

默認NHibernate的數據庫連接打開和關閉每筆交易。在第一個代碼片段中,每個語句都在一個單獨的隱式事務中執行,所以NHibernate在每個語句之後關閉連接。在第二個代碼片段中,只有在結束事務時才關閉連接,以便在事務結束之前不會刪除臨時表。順便說一句,在NH中使用隱式事務的方式是 discouraged

相關問題