Как сделать ленивую загрузку связей
Следующий метод показывает как делать принудительную загрузку ленивой связи:
public Project getProject(int id)
{
ISessionFactory factory = getCfg().BuildSessionFactory();
ISession session = factory.OpenSession();
Project p = (Project)session.CreateCriteria(typeof(Project))
.Add(Expression.Eq("Id", id)).UniqueResult();
//принудительная загрузка ленивых связей
if (!NHibernateUtil.IsInitialized(p.Participants))
{
NHibernateUtil.Initialize(p.Participants);
}
session.Close();
return p;
}
Если же не делать принудительную загрузку связей, то для загрузки связей, когда это необходимо, можно использовать следующий метод:
public void LoadParticipants(Project p)
{
ISessionFactory factory = getCfg().BuildSessionFactory();
ISession session = factory.OpenSession();
session.Lock(p, LockMode.None);
if (!NHibernateUtil.IsInitialized(p.Participants))
{
NHibernateUtil.Initialize(part.Participants);
}
session.Close();
}
Следует заметить, что без вызова метода LoadParticipants() при попытке обратиться к "ленивой" связи p.Participants(которая еще не загружена) будет брошено исключение
no session.