2012-02-20 2 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.

Смежные вопросы