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
