2012-02-20 13 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(); 

を動作しません。そして、私は2番目のクエリを(実行しようとすると、私は2番目に呼び出される前に作成された一時表の期限が切れたので、私は、オブジェクトの無効なエラーが出ますクエリ)。

ただし、以下のようなトランザクションで上記のコードを追加しても問題ありません。

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」値私は私の設定で使用NHibernateのではデフォルトでコール

答えて

4

あるデータベース接続が開かれ、各トランザクションのため閉鎖されています。最初のコードスニペットでは、各ステートメントは別々の暗黙的なトランザクションで実行されるので、NHibernateは各ステートメントの後に接続を閉じます。 2番目のコードスニペットでは、トランザクションを終了するときにのみ接続が閉じられ、一時テーブルはトランザクションの終了まで削除されません。ところで、NHでの暗黙のトランザクションの使用は discouragedです。

関連する問題