2014-11-03 1 views
1

В моей текущей задаче мне нужно взять какой-то существующий устаревший код (который использует raw ADO) и заставить его работать в NHibernate. Я хочу сохранить исходные запросы sql как есть, чтобы обеспечить точно такое же поведение.Как предотвратить NHibernate ISession для изменения соединения после выполнения каждого запроса?

Это то, что исходный код делает:

  1. Скопируйте все из таблицы А для временной таблицы #A (с помощью «вставить» заявление)
  2. Выполнить внешнюю утилиту BCP (через командную строку), которая является копирует все из файла резервной копии (.tbl) в таблице а,
  3. Скопируйте все из #A до а

(ради обсуждения, давайте предположим, что это вполне логично, и это то, что требуется сделать пе)

Проблема:

Я не могу запустить 1 + 3 в одном операторе, потому что у меня есть BCP вызов в середине. Поэтому я вынужден выполнять три отдельных звонка. Итак, я звоню 1, затем 2, затем 3 ... и получаю ошибку о недопустимом имени объекта #A.

Что на самом деле происходит? По-видимому, после каждого выполнения запроса NHibernate перерабатывает соединение ->, которое делает временную таблицу #A удаленной сразу после выполнения 1 (временные таблицы живут до тех пор, пока соединение не будет открыто).

Мне нужно как-то преодолеть эту проблему. В идеале, я хотел бы как-то сказать NHibernate постоянно поддерживать такое же соединение в течение этого процесса.

Спасибо!

P.S. Я попытался выполнить транзакцию 1 + 2 + 3. Это приводит к тупиковой ситуации с BCP (независимо от того, который IsolationLevel)

+0

В sqlserver вы можете создавать временные таблицы глобального масштаба. (## A вместо #A). Это может решить вашу проблему.(Но также могут вводить проблемы параллелизма, в зависимости от того, как они используются). http://stackoverflow.com/questions/18614344/scope-of-temporary-tables-in-sql-server-2012 –

+0

Также вы можете просто получить доступ к свойству 'ISession.Connection' и сохранить исходный код ADO? –

ответ

0

Я обнаружил, что если я создаю сеанс, предоставив соединение в его конструктор, то сеанс поддерживает это соединение полностью. Итак, это мое «быстрый & грязное» Решение:

ISession dummy = factory.OpenSession(); 

using (ISession session = factory.OpenSession(dummy.Connection)) 
{ 
// my stuff here. the connection will remain the same across multiple query executions 
} 

Как я понимаю, более элегантное решение возможно путем предоставления пользовательского IConnectionProvider - было бы неплохо, если бы кто-то могли бы обеспечить такое решение.

0
  1. Открытое заседание
  2. Начало транзакции
  3. Старт Задача 1
  4. Закрыть сделка
  5. Начало Задача 2
  6. Открытая сделка
  7. Start задача 3
  8. Закрытая сделка
  9. Закрытие сессии

Возможно, потребуется выполнить задачу 2 также в сделке.

+0

Я думаю, что между «Close transaction» и «Start task 2» nHibernate переключится на новое соединение, что является реальной проблемой. –

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