This is part of a series of posts about NHibernate Pitfalls. See the entire collection here.
If you want to lazily load an entity as part of a many to one or one to one endpoint, you must declare it as lazy. This way, a proxy can be generated for it, by subclassing it:
NHibernate’s built-in proxy factory requires that all properties and methods be declared virtual, not just the mapped properties, so keep this in mind.
If you want to change this behavior, you can either disable proxy validation:
Or you can make all properties and methods virtual and either public, protected or protected internal - internal and private won't do.