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
-~----------~----~----~----~------~----~------~--~---

Reply via email to