У меня есть небольшая программа, которая пытается обернуть вставку NHibernate в базу данных Informix в объекте TransactionScope, используя поставщик Informix .NET. Я получаю ошибку, указанную ниже. Код без объекта TransactionScope работает - в том числе, когда вставка помещается в транзакцию сеанса NHibernate. Есть идеи, в чем проблема? Кстати, без EnterpriseServicesInterop поставщик Informix .NET не будет участвовать в транзакции TransactionScope (проверено без участия NHibernate).
Фрагмент кода:
public static void TestTScope()
{
Employee johnp = new Employee { name = "John Prideaux" };
using (TransactionScope tscope = new TransactionScope(
TransactionScopeOption.Required,
new TransactionOptions() { Timeout = new TimeSpan(0, 1, 0),
IsolationLevel = IsolationLevel.ReadCommitted },
EnterpriseServicesInteropOption.Full))
{
using (ISession session = OpenSession())
{
session.Save(johnp);
Console.WriteLine("Saved John to the database");
}
}
Console.WriteLine("Transaction should be rolled back");
}
static ISession OpenSession()
{
if (factory == null)
{
Configuration c = new Configuration();
c.AddAssembly(Assembly.GetCallingAssembly());
factory = c.BuildSessionFactory();
}
return factory.OpenSession();
}
static ISessionFactory factory;
Трассировка стека:
NHibernate.ADOException не было обработано
Сообщение = "Не удалось закрыть соединение IBM.Data.Informix.IfxConnection"
Источник = "NHibernate"
Трассировки стека:
в NHibernate.Connection.ConnectionProvider.CloseConnection (IDbConnection conn)
в NHibernate.Connection.DriverConnectionProvider.CloseConnection (IDbConnection conn)
в NHibernate.Tool.hbm2ddl.SuppliedConnectionProviderConnectionHelper.Release ()
в NHibernate.Tool.hbm2ddl.SchemaMetadataUpdater.GetReservedWords (диалект диалекта, IConnectionHelper connectionHelper)
в NHibernate.Tool.hbm2ddl.SchemaMetadataUpdater.Update (ISessionFactory sessionFactory)
в NHibernate.Impl.SessionFactoryImpl..ctor (Конфигурация cfg, отображение IMapping, Настройки параметров, прослушиватели EventListeners)
в NHibernate.Cfg.Configuration.BuildSessionFactory ()
в HelloNHibernate.Employee.OpenSession () в D: \ Development \ ScratchProject \ HelloNHibernate \ Employee.cs: строка 73
в HelloNHibernate.Employee.TestTScope () в D: \ Development \ ScratchProject \ HelloNHibernate \ Employee.cs: строка 53
в HelloNHibernate.Program.Main (String [] args) в D: \ Development \ ScratchProject \ HelloNHibernate \ Program.cs: строка 19
в System.AppDomain._nExecuteAssembly (сборка сборки, аргументы String [])
в System.AppDomain.ExecuteAssembly (String assemblyFile, Evidence assemblySecurity, String [] args)
в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly ()
в System.Threading.ThreadHelper.ThreadStart_Context (состояние объекта)
в System.Threading.ExecutionContext.Run (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта)
в System.Threading.ThreadHelper.ThreadStart ()
InnerException: IBM.Data.Informix.IfxException
Сообщение = "ОШИБКА - информация об ошибке недоступна"
Источник = "IBM.Data.Informix"
ErrorCode = -2147467259
Трассировки стека:
в IBM.Data.Informix.IfxConnection.HandleError (IntPtr hHandle, SQL_HANDLE hType, RETCODE retcode)
в IBM.Data.Informix.IfxConnection.DisposeClose ()
в IBM.Data.Informix.IfxConnection.Close ()
в NHibernate.Connection.ConnectionProvider.CloseConnection (IDbConnection conn)
InnerException: