It looks like most calls of NHibernate session methods indirectly call
AbstractSessionImpl.EnlistInAmbientTransactionIfNeeded which delegates to
ITransactionFactory.EnlistInDistributedTransactionIfNeeded. So you may be
able to achieve what you want by implementing a custom transaction factory
and registering it in the NHibernate configuration.
Regards,
Gerke.
On Monday, 16 April 2012 12:18:07 UTC+2, John T wrote:
> This is/was our problem. We are using WCF to manage the TransactionScope,
> and are also using custom InstanceProviders to generate the Service's
> dependencies - including the NHibernate session.
>
> What would it take to get the session to enlist in the transactionscope
> even if the session has been created before the transactionscope has?
>
> To better ask the above question is: What would stop that from happening?
>
> The reason I am looking into this avenue and not changing the rest of our
> architecture is that it still does not make sense to have to create the
> Session AFTER the transactionscope. If we were not using TransactionScope,
> it just wouldn't make sense (nor even be possible) to start a Transaction
> before creating the Session - so why so different for a TransactionScope?
>
> Regards,
> J.
>
> On Saturday, April 14, 2012 9:16:26 PM UTC+1, Ramon Smits wrote:
>>
>>
>> Make sure that your session is created AFTER the transactionscope.
>>
>> On Fri, Apr 13, 2012 at 12:56 PM, 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.
>>>
>>>
>>
>>
>> --
>> Ramon
>>
>>