That is a completely fallacious statement. See the number of people on this issue asking for exactly the same thing:
http://nhibernate.jira.com/broswe/NH-2107 It is ABSOLUTELY feasible. MEF does it. Even L2S does it. Trying to update an object with just a TransactionScope is a perfectly acceptable desire - that is what the TS was designed for! J. On Monday, April 16, 2012 5:02:27 PM UTC+1, Diego Mijelshon wrote: > > Both of your examples are for inserts. > In neither case the instantiation location is important (you can try) > In neither case the object is a proxy, nor would it have to be even if it > was already persistent. > And in both cases, trying to update the object afterwards with just a > TransactionScope would not work. > > Just accept that it's not technically feasible for NH (or any other > framework) to do what you want, nor is it desirable for most people using > it. Completing a scope and flushing a unit of work are different things. > > Diego > > > On Mon, Apr 16, 2012 at 12:34, John T wrote: > >> Please re-read my examples. >> >> The error in your example is that "foo" is instantiated outside of the >> TransactionScope. In both of my examples the equivalent query occurs INSIDE >> the TransactionScope. >> >> either way, given that "foo" will be an instance of an NHibernate proxy, >> Yes indeed: why couldn't NHibernate know it is in a TransactionScope ?! >> >> Regards, >> J. >> >> On Monday, April 16, 2012 3:00:50 PM UTC+1, Diego Mijelshon wrote: >> >>> 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 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. >>>>>>> >>>>>> >>>>> >>> >