Я зависит от того, куда вы должны передать свой результат. В том же процессе, скажем, на сервере, вам не нужен какой-то специальный класс, потому что вы можете использовать ленивую загрузку. Вы настраиваете NHibernate для загрузки ссылочных объектов только при обращении к ним.
Если вы отправляете результат по сети, он будет другим, потому что вам нужно сериализовать данные и все свойства должны быть заполнены. На самом деле это не проблема NHibernate, это проблема интерфейса вашего сервера. Затем вам нужен специальный DTO (объект передачи данных), который включает в себя только те данные, которые необходимы клиенту.
Edit:
Я думаю, что вам нужна ленивая загрузка. Есть два разных типа ленивой загрузки. Ленивая загрузка коллекций и отложенная загрузка ссылок на отдельные объекты.
Пример:
class Employee
{
// make everything virtual to allow NH to build a proxy
public virtual string name { get; set; }
// will be lazy loaded
public virtual IList<Customers> Customers { get; private set; }
public virtual Employee Boss { get; set; }
}
Отображение
<!-- lazy=true is actually default -->
<class name="Employee" lazy="true">
<property name="Name"/>
<property name="Boss"/>
<!-- lazy=true is actually default -->
<bag name="Customers" type="Employee" lazy="true">
<key column="Employee_FK"/>
<one-to-many class="Employee" />
</bag>
</class>
Пример кода
using (ISession session = CreateSession())
using (ITransaction trx session.CreateTransaction())
{
// get a instance of an employee
// the boss and the customers are not loaded until now
Employee emp = session.Get<Employee>(empid);
// emp.Boss is a proxy. This is a subclass of employee
// generated by NH that implements the lazy loading
// this loads the boss' data
if (emp.Boss.Name == "gogogurt")
{
// this is your employee
}
// this loads the Customers
if (emp.Customers.Count == 0)
{
HumanResources.Fire(emp);
}
trx.Commit();
}
// outside the session you cannot access the lazy
// loaded properties.