Сбой транзакции NHibernate при вставке и обновлении в Oracle - PullRequest
0 голосов
/ 14 июля 2009

Опубликовать обновление: Я отследил проблему с помощью команды "ExecuteNonQuery". Это тот, который терпит неудачу во время обновления или зависает во время вставки. Попытка простого примера с использованием простого ADO.NET и их транзакций работает отлично. Кроме того ... это прекрасно работает на моем локальном домашнем компьютере, соединение с Oracle Express. Указав это снова в какой-то конфигурации сервера ?? Было бы неплохо войти в код NHibernate во время отладки, но до сих пор я все еще не могу установить это, даже если я перестроил исходный код и использовал эти файлы dll и pdb. Кто-нибудь мог сделать это раньше?

Я почесал голову над этим некоторое время. Я занимаюсь разработкой с NHibernate и базой данных Oracle 10g уже несколько дней, пока что использую только операторы select, которые прекрасно работают с отображением.

Теперь я начал реализовывать свои первые операторы вставки (сохранения) и обновления, но все тесты не пройдены. Все они терпят неудачу в компонентеaction.commit ().

При выполнении INSERT (Сохранить) код достигает транзакции.commit (), но затем "зависает". Тест продолжается без движения вперед. Это результат теста (обратите внимание, что тест продолжается)

NHibernate: select hibernate_sequence.nextval from dual
NHibernate: INSERT INTO MOB_PL_MAPPING_TEST (DES, TEST_ID) VALUES (:p0, :p1);:p0 = 'This is a test!', :p1 = 161

При выполнении ОБНОВЛЕНИЕ не работает транзакция.com.com (), и я получаю следующий стек ошибок:

NHibernate: SELECT test0_.TEST_ID as TEST1_10_0_, test0_.DES as DES10_0_ FROM MOB_PL_MAPPING_TEST test0_ WHERE test0_.TEST_ID=:p0;:p0 = 61
NHibernate: UPDATE MOB_PL_MAPPING_TEST SET DES = :p0 WHERE TEST_ID = :p1;:p0 = 'Changed!', :p1 = 61
TestCase 'Data.Tests.Test_Update_on_Test_Table'
failed: NHibernate.TransactionException : Rollback failed with SQL Exception
  ----> System.InvalidOperationException : This OracleTransaction has completed; it is no longer usable.
   c:\CSharp\NH\nhibernate\src\NHibernate\Transaction\AdoTransaction.cs(260,0): at NHibernate.Transaction.AdoTransaction.Rollback()
   E:\SubVersion\Application\Src\Data\UnitOfWork\Data.UnitOfWork\GenericTransaction.cs(26,0): at Data.UOW.GenericTransaction.Rollback()
   E:\SubVersion\Application\Src\Data\UnitOfWork\Data.UnitOfWork\UnitOfWorkImplementor.cs(49,0): at Data.UOW.UnitOfWorkImplementor.TransactionFlush(IsolationLevel isolationLevel)
   E:\SubVersion\Application\Src\Data\UnitOfWork\Data.UnitOfWork\UnitOfWorkImplementor.cs(36,0): at Data.UOW.UnitOfWorkImplementor.TransactionFlush()
   E:\SubVersion\Application\Src\Data\Data.Tests\Repositories\LoyaltyRepositoryTests.cs(159,0): at Data.Tests.Test_Update_on_Test_Table()
   --InvalidOperationException
   at System.Data.OracleClient.OracleTransaction.AssertNotCompleted()
   at System.Data.OracleClient.OracleTransaction.Rollback()
   c:\CSharp\NH\nhibernate\src\NHibernate\Transaction\AdoTransaction.cs(246,0): at NHibernate.Transaction.AdoTransaction.Rollback()

Я должен сказать, что я не известен оракулу, но кажется, что установление транзакции вызывает проблему. Хотя тот же код (с использованием транзакций) для оператора выбора (GET) работает нормально. Может ли это быть проблемой конфигурации оракула (блокировка транзакций вставки / обновления) или мне нужно настроить что-то еще на уровне приложения?

Кто-нибудь может мне помочь или пролить больше света на проблему, которая может возникнуть?

Заранее спасибо.

1 Ответ

0 голосов
/ 15 июля 2009

После того, как мне удалось подключить код NHibernate к моему отладчику, я смог пройти по коду до точки, где выполняется объект Command. Там проблема была в типах параметров. Параметры, для которых строка имеет тип, установленный в «String», где они должны быть «AnsiString».

Оказалось, я уже сталкивался с этой статьей, когда сопоставлял строку с идентификатором. http://www.jameskovacs.com/blog/NHibernateAndTheCaseOfTheCrappyOracleErrorMessage.aspx но больше об этом не думал.

В любом случае, добавление типа к каждому строковому свойству в отображении решило проблему.

<property name="Description" column="DES" type="AnsiString" />

Тревожные 3 дня ... но это решено: D

...