Yes I know and for that reason is lazy="no-proxy".
The many-to-one relationship has 3 possible lazy values :
lazy="false" (this is to avoid lazy)
lazy="proxy" (as we are working today)
lazy="no-proxy" (the property will work as lazy-load but without the proxy)

In the trunk we are "ignoring" the value no-proxy, interpreting it as
lazy="false", but its behaviour should be exactly what you are
implementing.

2010/1/24 Ayende Rahien <[email protected]>

> This is not for avoiding lazy loading.
> This is to allow lazy loading with the correct polymorphic type
>
>
> On Mon, Jan 25, 2010 at 12:11 AM, Fabio Maulo <[email protected]>wrote:
>
>> I'm sorry I don't understand...
>> We should have lazy="no-proxy" available for this scope.
>>
>> 2010/1/24 Ayende Rahien <[email protected]>
>>
>> Okay,
>>> I just committed initial support for this.
>>> Given the following mapping:
>>>  <class name="Order" table="Orders">
>>>  <id name="Id">
>>> <generator class="assigned" />
>>>  </id>
>>> <many-to-one name="Payment" *force-load-on-property-access="true"*/>
>>>  </class>
>>>
>>>
>>> <class name="Payment" abstract="true">
>>>  <id name="Id">
>>> <generator class="assigned" />
>>>  </id>
>>> <discriminator column="Type" type="System.String"/>
>>>  <subclass name="WireTransfer" discriminator-value="WT">
>>>  </subclass>
>>> <subclass name="CreditCard" discriminator-value="CC">
>>>
>>> </subclass>
>>>
>>> </class>
>>>
>>> The following test will pass:
>>>
>>> [Test]
>>> public void CanGetActualValueFromLazyManyToOne()
>>> {
>>> using (ISession s = OpenSession())
>>>  {
>>> var order = s.Get<Order>(1);
>>>
>>> Assert.IsTrue(order.Payment is WireTransfer);
>>>  }
>>> }
>>>
>>> There is one problem, though, and that is the identity map.
>>>
>>> public void GhostPropertyMaintainIdentityMap()
>>> {
>>> using (ISession s = OpenSession())
>>> {
>>> var order = s.Get<Order>(1);
>>>
>>> Assert.AreSame(order.Payment, s.Load<Payment>(1));
>>> }
>>> }
>>>
>>> This seems to all works.
>>>
>>> Thoughts?
>>>
>>> BTW, I really don't like the force-load-on-property-access, how about
>>> call it ghost="false" ?
>>>
>>> On Thu, Dec 31, 2009 at 11:32 AM, Ayende Rahien <[email protected]>wrote:
>>>
>>>> I am trying to figure out if we can support the following:
>>>>
>>>> class Comment
>>>> {
>>>>    public virtual Post Post {get;set;}
>>>> }
>>>>
>>>> class Post {}
>>>> class Article : Post {}
>>>>
>>>> And *not* generate a PostProxy for the property, but instead detect the
>>>> property access, force a load to return the correct type.
>>>> We can do it right now by specifying lazy=false, but that pre-load the
>>>> entity, while I would like to try to get it to load only on access time.
>>>>
>>>> There are several potential problems with this:
>>>> a) we need to replace the reference on first access, which means that
>>>> the _parent_ must be a proxy as well.
>>>> b) we disallow field access entirely.
>>>> c) identity map issues?
>>>>
>>>> other thoughts?
>>>>
>>>
>>>
>>
>>
>> --
>> Fabio Maulo
>>
>>
>


-- 
Fabio Maulo

Reply via email to