My actual model is somewhat more complex than this:
public interface INum
{
int Num { get; }
}
public class Cat : Entity, INum
{
private State state;
protected Cat() { }
public Cat(State state)
{
this.state = state;
}
public virtual State State { get { return state; } }
public virtual int Num { get { return state.Num; } }
}
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="MyAssembly"
namespace="MyNamespace">
<class name="Cat" table="Cats">
<id name="ID" column="CatID" type="Int32">
<generator class="hilo" />
</id>
<many-to-one name="State" access="field.camelcase" />
<property name="Num" access="readonly" />
</class>
</hibernate-mapping>
On Mon, Mar 9, 2009 at 6:05 PM, Fabio Maulo <[email protected]> wrote:
> 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
-~----------~----~----~----~------~----~------~--~---