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