Then, how would you handle this?

    var session = GetSession();
    var foo = session.Query<Foo>(...);
    using (var transactionScope = new TransactionScope())
    {
        foo.Bar = newValue;
        transactionScope.Complete();
    }

The update could never happen as there's no way for NH to catch the change.
I't likely the same with other frameworks like EF; if you don't call
SaveChanges (which is the method that creates the transaction, flushes and
commits), completing the scope will do nothing.

    Diego


On Mon, Apr 16, 2012 at 10:16, John T <[email protected]> wrote:

> .. which is the crux of this problem/discussion. There should be, because
> it is used within a TransactionScope, and when the TransactionScope
> completes - so should NHibernate.
>
>
> On Monday, April 16, 2012 1:56:32 PM UTC+1, Diego Mijelshon wrote:
>
>> The former would probably persist if you flushed the session. The problem
>> is, there's absolutely nothing telling NH to save the changes to the DB.
>>
>>     Diego
>>
>>
>> On Mon, Apr 16, 2012 at 07:20, John T wrote:
>>
>>> Hi, The example code in my original post is a perfect example. The
>>> former doesn't persist, and the latter does.
>>>
>>> Regards,
>>> J.
>>>
>>> On Saturday, April 14, 2012 7:50:51 PM UTC+1, James Kovacs wrote:
>>>
>>>> I'm confused by your assertion. I have used NHibernate in production
>>>> applications using TransactionScope for transaction management.
>>>> NHibernate properly enlisted in the ambient transaction. There was no
>>>> need to call session.BeginTransaction()/tx.Commit() as well as new
>>>> TransactionScope()/scope.Complete(). Just the latter was sufficient
>>>> for proper transaction semantics. Are you using NHibernate 3.2? Can
>>>> you provide a test case demonstrating the issue that you're seeing?
>>>>
>>>> James
>>>>
>>>> On Apr 13, 4:56 am, John T wrote:
>>>> >  Hi group,
>>>> >
>>>> > so I've discovered that NHibernate does not integrate at all well
>>>> with the
>>>> > Ambient Transaction. In fact, when using NHibernate within a
>>>> > TransactionScope, one would be forgiven for thinking it doesn't
>>>> integrate
>>>> > at all.
>>>> >
>>>> > What should be the correct usage:
>>>> >
>>>> > public void Foo()
>>>> > {
>>>> >    ISession session = null; // get session from wherever
>>>> >
>>>> >    using (var transactionScope = new TransactionScope())
>>>> >    {
>>>> >      session.Save(new PersistableObject { ArbitraryProperty = "a
>>>> value" });
>>>> >      transactionScope.Complete();
>>>> >    }
>>>> >
>>>> > }
>>>> >
>>>> > is completely useless. What you actually have to do is:
>>>> >
>>>> > public void Foo()
>>>> > {
>>>> >    ISession session = null; // get session from wherever
>>>> >
>>>> >    using (var transactionScope = new TransactionScope())
>>>> >    using (var transaction = session.BeginTransaction())
>>>> >    {
>>>> >      session.Save(new PersistableObject { ArbitraryProperty = "a
>>>> value" });
>>>> >      transaction.Commit();
>>>> >      transactionScope.Complete();
>>>> >    }
>>>> >
>>>> > }
>>>> >
>>>> > So the fact that NHibernate has any integration with the Ambient
>>>> > Transaction seems completely pointless.
>>>> >
>>>> > Now, I've looked (only cursory thus far) through the NHib src and
>>>> have
>>>> > noted a few areas of interest wrt to integrating with the Ambient
>>>> > Transaction. But I want to ask if anyone has tried this already, and
>>>> hit
>>>> > any barriers along the way?
>>>> >
>>>> > Regards,
>>>> > John.
>>>>
>>>
>>

Reply via email to