Почему временные таблицы не работают в nhibernate? - PullRequest
4 голосов
/ 20 февраля 2012

Я пытался использовать временные таблицы вместе с 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», которое я использовал в моей конфигурации, это вызов

1 Ответ

4 голосов
/ 20 февраля 2012

По умолчанию в NHibernate соединение с базой данных открывается и закрывается для каждой транзакции.В первом фрагменте кода каждый оператор выполняется в отдельной неявной транзакции, поэтому NHibernate закрывает соединение после каждого оператора.Во втором фрагменте кода соединение закрывается только после завершения транзакции, поэтому временная таблица не удаляется до конца транзакции.Кстати использование неявных транзакций в NH не рекомендуется .

...