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

Reply via email to