Ups!!! pretty quickly despite SVN 2010/1/24 Ayende Rahien <[email protected]>
> Implemented & committed > > > On Mon, Jan 25, 2010 at 12:22 AM, Fabio Maulo <[email protected]>wrote: > >> 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 >> >> > -- Fabio Maulo
