When I replace my reference to mapped orderDates field with a reference to public virtual property OrderDates (which simply orderDates), the problem goes away.
So this fails: 1) call public virtual property ActualDeliveredDate getter 2) calls a few levels down into private methods 3) last private method references mapped private field orderDates 4) orderDates is null While this succeeds: 1) call public virtual property ActualDeliveredDate getter 2) calls a few levels down into private methods 3) last private method references public virtual property OrderDates 4) OrderDates references orderDates, which is not null So the difference is nothing to do with the public surface of the entity but what some private method calls. It's really painful to think that we must take care throughout a class to not access it's own private data directly from other private members. I would call that a bug. But in working through this, I hit upon another place where I apparently do not understand NH 3 behavior. The error only occurs when the Order is actually an OrderProxy. The client code looks something like this. dto.Foo = parent.Order.Foo; dto.Bar = parent.Order.Bar; dto.ActualDeliveryDate = parent.Order.ActualDeliveryDate; When this code is entered, Order is still a proxy because it is mapped as lazy="proxy". But should not the proxy be invoked on the first line? By the time the third line is hit shouldn't it be a real Order? What does trigger invocation of lazy many-to-one properties? On Apr 11, 4:00 pm, Tim Scott <[email protected]> wrote: > The protected field that is null (orderDates) is accessed via a public > virtual property getter. This property is read-only (no setter). The > field (orderDates) is not referenced directly in this property getter > but a few private methods down. > > Incidentally, the error appears only after the same code path is > called many times (in a loop) without error. The error appears on a > particular instance of an entity (Order). > > I feel certain that the entity (Order) has all of it's public members > as virtual (it's proxy-able) because it is mapped as lazy=true. > > On Apr 7, 4:26 pm, Fabio Maulo <[email protected]> wrote: > > > > > > > > > Is not a matter of initialization but a matter of access. > > probably you are trying to access to the field from a no virtual property > > and the instance you are using is a proxy. > > > On Thursday, April 5, 2012 6:29:25 PM UTC-3, Tim Scott wrote: > > > > After upgrading to NH 3.2.0.4000 we now get an exception here because > > > orderDates is null. > > > > foreach (var orderDate in orderDates) > > > > It's declared thusly: > > > > protected IList<OrderDate> orderDates = new List<OrderDate>(); > > > > And mapped like this: > > > > <bag name="orderDates" access="field.camelcase" inverse="true" > > > lazy="true" cascade="all-delete-orphan" > > > > <key column="OrderId" /> > > > <one-to-many class="OrderDate" /> > > > </bag> > > > > A few frames down in the stack trace is: > > > > at NHibernate.Proxy.DefaultLazyInitializer.Intercept(InvocationInfo > > > info) > > > > There are no matching order date rows in the database. > > > > Why is NH lazy initializing this collection to null instead of > > > empty? How can I fix? -- 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.
