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

Reply via email to