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