2011-02-08 17 views
5

İşlem kapsamındaki Nhibernate ve ADO.Net işlemlerini kullanırken şu özel durumu alıyorum: Scope.Eg. Nhibernate 2.1 ile iyiydi ama şimdi hata atar 3.0'a yükseltildi. Bu şekilde ortam işlem görür yana hatam varsa dış işlem beni completes.correct önceTransactionScope Hatası ile Nhibernate - DTC işlemi prepre fazı başarısız - Nhibernate 3.0'a Yükseltme

using (var scope = new TransactionScope(TransactionScopeOption.Required)) 
{ 
     GetmemberId(); --> NHibernate Call 
     Update(); ADO Call OracleDB 
} 

, Nhibernate yakında işlem elden çalışır, bana yardım çünkü herhangi bir çözüm var mı, Ama dışarıda Nhibernate çağrı taşıdığınızda TransactionScope her şey iyi çalışıyor. Ben verdik örnek numune biridir, mayınlar, daha karmaşık bir tane içeren Tip I TransactionScope içindeki aramaları ve IAM alma hatasını tutmak beri

HATA, şöyle 13 NHibernate.Impl.AbstractSessionImpl olduğunu - DTC işlem prepre fazı başarısız System.ObjectDisposedException: Atılan bir nesnesine erişilemiyor. Nesne adı: 'İşlem'. System.Transactions.TransactionScope.PushScope de System.Transactions.TransactionScope.SetCurrent de System.Transactions.Transaction.DependentClone (DependentCloneOption cloneOption) (İşlem newCurrent)() System.Transactions.TransactionScope.Initialize de
(İşlem Aşamasında System.Transactions.TransactionScope..ctor de transactionToUse, ZamanGeçişi scopeTimeout, Boole interopModeSpecified) NHibernate.Transaction.AdoNetWithDistributedTransactionFactory.DistributedTransactionContext.System.Transactions.IEnlistmentNotification.Prepare (PreparingEnlistment preparingEnlistment de (İşlem transactionToUse)) 2011-02- 08 13: 41: 46,033 HATA 13 NHibernate.Impl.AbstractSessionImpl - DTC işlemi prepre aşaması başarısız oldu System.ObjectDisposedException: Atılan bir nesnesine erişilemiyor. Nesne adı: 'İşlem'. System.Transactions.TransactionScope.PushScope de System.Transactions.TransactionScope.SetCurrent de System.Transactions.Transaction.DependentClone (DependentCloneOption cloneOption) (İşlem newCurrent)() System.Transactions.TransactionScope.Initialize de
(İşlem Aşamasında NHibernate.Transaction.AdoNetWithDistributedTransactionFactory.DistributedTransactionContext.System.Transactions.IEnlistmentNotification.Prepare (preparingEnlistment preparingEnlistment de System.Transactions.TransactionScope..ctor de transactionToUse, ZamanGeçişi scopeTimeout, Boole interopModeSpecified) (İşlem transactionToUse))

cevap

6

Configuration.SetProperty(Environment.TransactionStrategy,"NHibernate.Transaction.AdoNetTransactionFactory")

deneyin Veya nhibernate config

<property name="transaction.factory_class"> 
NHibernate.Transaction.AdoNetTransactionFactory 
</property> 
Benim için çalıştı

=)

+0

Teşekkür ederiz! Benim için de çalıştı! – Saxophonist

1

Bu aynı hataya koştu ve bu arada neden oldu Web API'mızda NHibernate ile oturumlar ve işlemler kullandık.

biz isteğine göre oturum kullanıyor. (Bu bir web isteği veya bir NServiceBus işleyicisinin yürütülmesi olabilir.) Bir istek başladığında, bir oturum açmalı ve bir işlem başlatmalısınız.

Bunu yapmıyorduk. Depolarımızda her veritabanı talebi için yeni bir oturum ve işlem oluşturduk. Bu, bir istek için tek bir seans/işlem yapmaktan ziyade, çok şeyimiz olduğu anlamına geliyordu.

Hataların bizim için temel nedeni, bir oturumda (etki alanı model nesnesini) bir oturumda yüklememiz, değiştirmemiz ve farklı bir oturum kullanarak kaydetmemizdi. NHibernate, güncelleme çağrısını yürütürken, yükleme oturumu/işlemi zaten gerçekleştirildi, temizlendi ve kapatıldı.

Çözüm, oturum/işlem oluşturmamızı depolardan ve Denetleyici katmanına (REST çağrıları için HttpModule kullanarak ve/veya bağımlılık enjeksiyonunu kullanarak en boy yönelimli programlamayla yapılabilir) çekmekti. Bu bir oturum/işlem daha sonra REST çağrısı veya NServiceBus işleyicisi yürütme ömrü boyunca yaşar ve bu çağrı sırasında tüm veritabanı erişimi için kullanılır. Bu çağrı sona erdiğinde, uygun şekilde işlenecek veya geri alınacaktır.

Yukarıda verilen yanıt, yapılandırma özelliğinin ayarlanması basitçe DTC'yi kapatır ve NHibernate işlemlerinin eski yoluna döner. Web Api'nizi birden çok örneğe yükseltmek zorunda kalmazsanız, bu sizin için sorunu çözebilir, ancak eğer yaparsanız, bu size sorunlara neden olur.