Merge is of no value here. We need a completely new instance with but
with values from db and it shoud worlk along cascades.

Tyler,

As I understand you're working on desktop app as this kind of problems
only show up in desktop apps. Me too.

NHibernate is perfect for web apps but not so developer friendly for
desktop development as I want it to be. The need for Clone and Merge
is obvious for desktop apps.

Take a look how this is works in other ORM frameworks. I'm familiar
with TopLink and it's UnitOfWork works in such friendly way. See here
http://toplink.waldura.com/javadoc/oracle/toplink/sessions/UnitOfWork.html.

Basically you're registering an original object within UoW and it lend
back to you a full clone that you will use for editing. This is of
course respect an aggregate boundaries (ie cascades). You can even
start nested UoW for some child ojbect inside aggregate and when you
commit it it will merge values back to parent UoW. This is very handy
for Parent-Child, Ok-Cancel scenario.

Imagine that you have Customer -> Order -> OrderLine model.
You can start edit Customer and then create nested UoW for Order or
even OrderLine.
When you will create nested UoW for Order it will backreference to
clone of Customer (which is a totally proper behavior). Check url
above.

We need this kind of infrastructure support for desktop apps. Some
time ago I've created framework to deal with this. It was using a lot
of NH internals and than i dsicarded it (well it was hard to be in
sync with internal stuff as NH experienced a major refactor over last
few years :) and get back to manual cloning.

Everything there but we just need to use it somehow. For example NH
can dehydrate object graph data into 2nd level cache and than back to
new instance. If we can somehow use this feature thatt will be cool.
We can assemble new instance from data and attach it to session. This
is what I'm looking for.

If we can't get support from NH devs than we're out of luck :( (as all
other desktop app devs) and I will be interested to cooperate with you
on writing such generic Clone-Merge functionality (I like TopLink's
implementation :).

Cheers.

On 19 июн, 21:24, Tyler Burd <[email protected]> wrote:
> That does look handy; thanks!
>
> I've also started following the meta-data to get to the cascade settings, so 
> if I come up with a generic way to handle this I'll post it here in case it's 
> useful to others.
>
> From: [email protected] [mailto:[email protected]] On Behalf Of 
> Fabio Maulo
> Sent: Friday, June 19, 2009 11:37 AM
> To: [email protected]
> Subject: [nhusers] Re: deep copy aggregate root
>
> Perhaps AutoMapper is useful in your case.
> 2009/6/19 Tyler Burd <[email protected]<mailto:[email protected]>>
>
> Hiya, Fabio.
>
> I'm not annoyed to do it by myself, it's just that when adding properties to 
> a persistent class the development team has to remember to add those 
> properties into all of the places the deep copy occurs as well.  This is 
> pretty error prone and non-obvious.  Serialization doesn't do it, because 
> there are some associations that aren't supposed to get copied (as they 
> aren't part of the aggregate tree).  Here is an example:
>
> class UserSettings
>
>  -Id
>
> -MailingAddress <-set to cascade=all
>
>  -Organization <-set to cascade=none
>
> var newUserSettings = deepCopy(oldUserSettings);
>
> newUserSettings.MailingAddress.City = "Denver";
>
> session.Save(newUserSettings);
>
> This would result in two separate UserSettings rows in the db, both with 
> unique ids.  It would also result in a completely new MailingAddress row, but 
> NOT a new Organization row.
>
> Serialization won't work, because I can only say "serialize or ignore this 
> property".  I can't say "when performing a deep copy, either cascade it to 
> this object or just copy over the reference, depending on the cascade 
> settings".
>
> I was simply curious to see if anyone had encountered this issue before and 
> if they had any pointers.  The need seems to pop up pretty often here.
>
> From: [email protected]<mailto:[email protected]> 
> [mailto:[email protected]<mailto:[email protected]>] On Behalf 
> Of Fabio Maulo
> Sent: Friday, June 19, 2009 10:28 AM
> To: [email protected]<mailto:[email protected]>
> Subject: [nhusers] Re: deep copy aggregate root
>
> 2009/6/19 Yevhen.Bobrov 
> <[email protected]<mailto:[email protected]>>
>
> I've tried creating fresh session and using SaveOrUpdateCopy to get
> back clone.
> But the problem I see now (maybe a bug until someone can prove that
> this is by design) that SaveOrUpdateCopy do not create clones of
> collections.
>
> The method is session.Merge and its behaviour depend on cascade in the 
> mapping.
>
> The Merge work with entities so what you will have is each entity merged even 
> if inside a collection.
>
> If you want a completely new instance with DB values you should use Refresh 
> (another time refresh work depending on cascade in the mapping).
>
> Btw what you should do is a deep copy... annoyed to do it by your self ? 
> well... what we should do ?
>
> If you want an easy implementation of DeepCloner it is very easy. Define all 
> your entities as Serializable, manage the serialization attributes where 
> needed, and use the BinaryFormatter.
>
> --
> Fabio Maulo
>
> --
> Fabio Maulo
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"nhusers" 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/nhusers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to