NHibernate事务在Oracle上的插入和更新失败

时间:2009-07-14 13:04:52

标签: oracle nhibernate transactions insert

发布更新:我已在命令“ExecuteNonQuery”中找到了问题。这是在更新期间失败或在插入期间挂起的那个。尝试使用普通ADO.NET的简单示例,他们的交易非常完美。此外...它在本地家用计算机连接和Oracle Express版本上运行良好。在某种服务器配置中再次指向它? 在调试时进入NHibernate代码会很好,但到目前为止我仍然无法设置它,即使我重建了源代码并使用了那些dll和pdb文件。有人能够做到这一点吗?

我一直在摸不着头脑。我已经用NHibernate和一个Oracle 10g数据库开发了几天,到目前为止只使用了与映射一起工作的select语句。

我现在开始实现我的第一个插入(保存)和更新语句,但测试都失败了。 它们都在transaction.commit()部分失败。

执行 INSERT (保存)时,代码到达transaction.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

执行 UPDATE 时,transaction.commit()失败,我收到以下错误堆栈:

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()

我必须说我对oracle不了解,但似乎建立事务会导致问题。虽然select语句(GET)的相同代码(使用事务)工作正常。 这可能是一个oracle配置问题(阻塞插入/更新事务)还是我必须在应用程序级别配置其他东西?

有人可以帮助我,或者更多地了解可能出现的问题吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

在设法将NHibernate代码连接到我的debuger之后,我能够逐步执行代码,直到执行Command对象。 在那里,问题可以在参数类型中找到。字符串的类型设置为“String”的参数,其中它们的位置为“AnsiString”。

原来,我在将字符串映射到id时已经遇到过这篇文章 http://www.jameskovacs.com/blog/NHibernateAndTheCaseOfTheCrappyOracleErrorMessage.aspx 但是没想到更多。

无论哪种方式,将类型添加到映射中的每个字符串属性都解决了问题。

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

忙碌的3天......但它已经解决了:D