当我使用一次性方法时,如何促进Nhibernate中的延迟加载?

当我使用一次性方法时,如何促进Nhibernate中的延迟加载?,nhibernate,fluent-nhibernate,lazy-loading,Nhibernate,Fluent Nhibernate,Lazy Loading,目前,我正在为我的应用程序开发存储库,延迟加载给了我很大的性能提升,但是在我使用这样的代码块时,这是不可能的 public IList<T> GetAll() { using (var session = SessionFactory.OpenSession()) { try { return new List<T>(session.QueryO

目前,我正在为我的应用程序开发存储库,延迟加载给了我很大的性能提升,但是在我使用这样的代码块时,这是不可能的

    public IList<T> GetAll()
    {
        using (var session = SessionFactory.OpenSession())
        {
            try
            {
                return new List<T>(session.QueryOver<T>().Future());
            }
            catch (HibernateException)
            {
                throw;
            }
            finally
            {
                session.Flush();
            }

        }
    }
public IList GetAll()
{
使用(var session=SessionFactory.OpenSession())
{
尝试
{
返回新列表(session.QueryOver().Future());
}
捕获(休眠异常)
{
投掷;
}
最后
{
session.Flush();
}
}
}
由于
会话
在我完成后被释放,因此当我尝试读取代码中对象的引用时,我将收到延迟加载异常

我的问题是:

  • 使用块
    (使用(var session=factory.OpenSession))
    的重要性是什么, 为什么对存储库中的所有方法使用单个会话而不刷新它是一种不好的做法

  • 是否可以对using块使用延迟加载

  • 谢谢

    使用块的重要性是什么

    参考:

    using语句调用中对象的Dispose方法 正确的方式,并且(当您如前所示使用它时),它也会导致 对象本身在调用Dispose后立即超出范围。在内部 使用块时,对象为只读,无法修改或删除 重新分配

    .OpenSession()
    返回的
    Session
    对象实现了
    IDisposable

    为什么对存储库中的所有方法使用单个会话而不刷新它是一种糟糕的做法? 是否可以对using块使用延迟加载

    我不太理解问题的后半部分,NHibernate中的
    会话
    被视为工作单元,我相信您需要选择合适的上下文会话模式

    • 每个线程的会话数
    • 每个请求的会话(对于web应用程序)
    • 每个会话的会话数
    参考: