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

Reply via email to