The fact is that the Merge need to read the state from DB but with its result in the persistent class (not from DataReader).BTW I don't understand how you can work with that entity... NH use the parameterless ctor not only for Merge but even when you use session.Get<T>(id). In case of Get/Load who are injecting the State instance ?
2009/3/9 Germán Schuager <[email protected]> > Thanks Fabio, I will take a look at what a tuplizer is :), but I don't see > why NH needs to access the properties of a newly created object just to > overwrite them with the transient instance properties' values. > > I'm browsing the NH source to trying to find out but it is complex beast... > > It seems that this drags from the fact that both EntityIsTransient and > EntityIsDetached are using the same method (CopyValues) to update the > properties of the resulting persistent entity. Do you see room for > improvement here or I should just move on? > > Thanks again. > > > On Mon, Mar 9, 2009 at 4:27 PM, Fabio Maulo <[email protected]> wrote: > >> Ah.. sorry.. in Merge sure it access to the getter... sorryIf you need a >> certain ctor you should implement your own tuplizer (I don't know where you >> will find the State instance but it is another matter). >> >> >> 2009/3/9 Germán Schuager <[email protected]> >> >>> I've tried it. It does access the getters when merging an entity in the >>> method CopyValues of DefaultMergeEventListener.cs >>> >>> >>> https://nhibernate.svn.sourceforge.net/svnroot/nhibernate/trunk/nhibernate/src/NHibernate/Event/Default/DefaultMergeEventListener.cs >>> >>> >>> On Mon, Mar 9, 2009 at 3:14 PM, Fabio Maulo <[email protected]>wrote: >>> >>>> NH don't access to the getter during object creation. Try it. >>>> >>>> >>>> 2009/3/9 Germán Schuager <[email protected]> >>>> >>>>> Hi Fabio, >>>>> >>>>> Num is a persistent property, and I have several entities that >>>>> implement INum; in this case Cat is delegating its actual implementation >>>>> to >>>>> its private field "state". >>>>> >>>>> I don't think that a nosetter access for Num would solve the problem >>>>> because the exception would be generated anyway (when accessing the getter >>>>> of Num for the newly instantiated Cat, the persistent one, which has state >>>>> == null yet). >>>>> >>>>> And with the readonly accesor it would also be the same. >>>>> >>>>> The problem here is that NH is trying to read Num from an entity that >>>>> is in an invalid state in order to compare this value with the transient >>>>> one >>>>> that I'm trying to merge, to determine if it should be copied or not. (At >>>>> least I think this is the problem) >>>>> >>>>> Does this make sense? >>>>> >>>>> >>>>> On Mon, Mar 9, 2009 at 1:51 PM, Fabio Maulo <[email protected]>wrote: >>>>> >>>>>> If Num is a persistent property you should use- a field only to make >>>>>> NH happy (you don't need to use it) >>>>>> - Num access="nosetter.camelcase"... if I well remember we have >>>>>> another accessor in NH2.1 access="read-only" >>>>>> >>>>>> 2009/3/9 Germán Schuager <[email protected]> >>>>>> >>>>>> Hi, >>>>>>> >>>>>>> I want to do a merge of a transient object which some of its >>>>>>> properties are assigned with detached objects, in order to get a >>>>>>> persistent >>>>>>> object with all its properties assigned with persistent instances (using >>>>>>> cascade="merge"). Is this the correct usage scenario for merge? >>>>>>> >>>>>>> Here is a sample entity: >>>>>>> >>>>>>> public interface INum >>>>>>> { >>>>>>> int Num { get; } >>>>>>> } >>>>>>> >>>>>>> public class Cat : Entity, INum >>>>>>> { >>>>>>> private State state; >>>>>>> >>>>>>> protected Cat() { } >>>>>>> >>>>>>> public Cat(State state) >>>>>>> { >>>>>>> this.state = state; >>>>>>> } >>>>>>> >>>>>>> public State State { get { return state; } } <--- mapped using >>>>>>> access="field.camelcase" >>>>>>> >>>>>>> public int Num { >>>>>>> get { return state.Num; } >>>>>>> set { state.Num = value; } >>>>>>> } >>>>>>> >>>>>>> } >>>>>>> >>>>>>> The problem that I'm facing is that Merge is trying to read the Num >>>>>>> property from a Cat created using the protected constructor (the >>>>>>> persistent >>>>>>> instance?) before assigning its "state" field, thus throwing a >>>>>>> NullReferenceException in the getter. >>>>>>> >>>>>>> A simple solution would be to add a check to verify that state != >>>>>>> null in the getter, but that would be only to support NH functionality >>>>>>> and >>>>>>> it would have nothing to do with my domain. >>>>>>> >>>>>>> Do I need to add the check for state != null? >>>>>>> Can NH be improve to handle this situation? >>>>>>> >>>>>>> Regards. >>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Fabio Maulo >>>>>> >>>>>> >>>>>> >>>>> >>>>> >>>>> >>>> >>>> >>>> -- >>>> Fabio Maulo >>>> >>>> >>>> >>> >>> >>> >> >> >> -- >> 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 -~----------~----~----~----~------~----~------~--~---
