Hi, Thanks for you answer. I think it does work because I have a global session (TransactionScope) and I want to flush it into the DB only if the user hit the 'Save' button. If I create a transaction for my edition dialog I have two solutions :
1) A inherited transaction My loaded parent will be takes from the cache of my global transaction. If I add a child object to my parent and then call 'VoteRollBack' and 'Dispose' from my transaction the added child will not be removed from my parent. 2) A new transaction I can't load my parent because it only exists in my global transaction cache which has not be yet flushed. The two caches from both transaction are independent. So if I want to load an object from a transaction, the other has to be flushed into the DB. Is it right ? I really don't understand how I can use nHibernate (and ActiveRecord) with a real application :'(. My approach is certainly wrong. I don't find a concrete example of an application using nHibernate (and ActiveRecord). Regards. /Greg On Jan 14, 2:49 pm, "Markus Zywitza" <[email protected]> wrote: > This should work fine: > > 1) You load parent and all associated childs in non-flushing sessionscope. > 2) More childs are added. No one calls save or something, so new > childs are still transient. > 3) On Save-button pressed, call save on parent and cascade changes to child. > 4) On Cancel-button presses, discard the sessionscope and reload > object in a new one. > > If you are using IDENTITY PKs, don't call save on childs, but rely on > cascading instead! Saving them adds them to the DB instantly, > regardless of flushing behaviour! > > -Markus > > 2009/1/13 Greg Burri <[email protected]>: > > > > > Hi, > > I use nHibernate with ActiveRecord in a such manner : > > * I have a global session of type 'TransactionScope' > > * When the user want to save his work his click on "file -> save" > > of the application menu. This action will execute a such code : > > globalSession.VoteCommit(); > > globalSession.Dispose(); > > globalSession = new TransactionScope(); > > > Basically I have a dialog to edit an object 'p' of class 'Parent' > > which owns some objects 'c' of class 'Child'. Both of theses classes > > deriving from 'ActiveRecordLinqBase'. > > > When the user choose 'Cancel' from the dialog after editing some > > values of 'a' and adding or removing some B objects I want to reverse > > theses changes (that is remove 'Child' objects that was added and add > > removed 'Child' objects). > > > (Case 1) If I use the method "p.Refresh()" there will be an exception > > like "No row with the given identifier exists[Child#0]" in the case > > the user added some 'c'. > > (Case 2) If I use a transaction with "p.SaveAndFlush()" + > > "t.VoteRollBack()" + "t.Dispose()" then this error will be throwed : > > "Illegal attempt to associate a collection with two open > > sessions" (for the same case above, where a 'b' is added). > > > Is my approach is good ? Or it's a misusing of nHibernate and > > ActiveRecord ? > > > I have uploaded a little sample project here : > >http://www.gburri.org/bordel/ActiveRecordLifecycle.zip. If you want to > > run it you need PostgreSQL or change the 'app.config'. > > This sample will create a parent and some children attached to it at > > launch. > > You can edit the 'Parent' object and change its state with the button > > "Change state" and try to undo the modifications with "Cancel". > > > Here are some additional information about my configuration : > > > nHibernate version: 2.1.0.1001 > > Active record version: 1.0.3.0 > > Database: PostgreSQL 8.3 > > > Thanks in advance. > > > /Greg --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Castle Project Users" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/castle-project-users?hl=en -~----------~----~----~----~------~----~------~--~---
