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?