Мой код выглядит следующим образом. Моя проблема в том, что когда я использую NHibernate для извлечения объекта, который содержит свойство навигации, и пытаюсь установить значение в этом объекте свойств навигации, он выдает ошибку, говорящую о том, что сеанс не существует.NHibernate подход для поддержки объекта Isession
[The 'f.HIERARCHY.CHANGETIME = DateTime.Now;' линия внутри основного метода]
Я понимаю, что это происходит потому, что, когда NHibernate пытается принести «ИЕРАРХИЯ» объект сеанс уже закрыт внутри хранилища класса
Что мне нужно знать, это стандартный подход писать код, чтобы я мог по-прежнему использовать ленивую загрузку, но потом может получить доступ к свойствам навигационных объектов в коде БЕЗ отключение ленивой загрузки.
Это хороший подход, чтобы всегда держать объект Isession открытым? Большинство образцов кода, которые я нашел в Интернете, всегда открывают новый сеанс для каждой операции CRUD для каждой операции и немедленно закрывают ее. Как они могут решить проблему доступа к свойствам навигации позже в коде?
public class NHibernateBaseRepository : IDisposable
{
private ISessionFactory m_SessionFactory = null;
private ISession m_Session = null;
public T GetById<T>(long id)
\t \t {
\t \t \t using (ISession session = m_SessionFactory.OpenSession())
\t \t \t {
\t \t \t \t return session.Get<T>(id);
\t \t \t }
\t \t }
}
public class ROLE
{
public virtual string RoleComment { get; set; }
public virtual HIERARCHY HIERARCHY { get; set; }
}
public class HIERARCHY_STRUCTURE
{
public virtual DateTime CHANGETIME{ get; set; }
}
class Program
{
static void Main(string[] args)
\t \t {
\t \t \t NHibernateBaseRepository persistenceManager = new NHibernateBaseRepository();
\t \t \t ROLE f = persistenceManager.GetById<ROLE>(34);
\t \t \t f.RoleComment = "Test Com";
\t \t \t f.HIERARCHY.CHANGETIME = DateTime.Now; //Throws error
\t \t \t persistenceManager.SaveOrUpdateEntitiy<ROLE>(f);
}
}