Mapping please. 2009/3/9 Germán Schuager <[email protected]>
> inline > > On Mon, Mar 9, 2009 at 5:11 PM, Fabio Maulo <[email protected]> wrote: > >> The fact is that the Merge need to read the state from DB but with its >> result in the persistent class (not from DataReader). > > > I think that I understand. That is the case of merging a detached entity, > but when merging a new transient entity that it is not in the DB then NH > does not need to do this, does it? > > >> 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). >> > > Yes, but when using session.Get, it creates the new entity and WRITE its > properties (*), on the other hand when using session.Merge it creates the > entity and READ its properties. > > >> In case of Get/Load who are injecting the State instance ? >> > > NH is assigning the state field. I don't understand what you mean. > > > > (*) here the problem could be that NH tries to set Num before State, but > this is due to me trying to simplify my domain; just suppose that Num > doesn't have a setter and is mapped using access="readonly" > > > >> >> >> 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 >> >> >> > > > > -- 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 -~----------~----~----~----~------~----~------~--~---
