当我使用Disposable方法时,如何在Nhibernate中促进延迟加载?

时间:2014-05-21 21:24:43

标签: nhibernate fluent-nhibernate lazy-loading

目前我正在为我的应用程序开发存储库,延迟加载给我一个很好的性能推动,但是当我使用这样的代码块时它不可能

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

        }
    }

因为session在我完成之后被处理掉了,所以当我尝试在代码中读取我的对象的引用时,我将收到延迟加载异常。

我的问题是:

  1. 使用块(using (var session = factory.OpenSession))的重要性是什么, 为什么在没有刷新它的情况下对存储库中的所有方法使用单个会话是不好的做法?

  2. 是否可以在使用块中使用延迟加载?

  3. 由于

1 个答案:

答案 0 :(得分:0)

使用块的重要性是什么?

参考:http://msdn.microsoft.com/en-us/library/yh598w02.aspx

  

using语句在对象中调用Dispose方法   正确的方式,(当你使用它如前所示)它也会导致   一旦调用Dispose,对象本身就会超出范围。内   使用块,该对象是只读的,不能修改或   重新分配。

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

为什么在不刷新存储库的情况下对存储库中的所有方法使用单个会话是不好的做法? 是否可以对使用块使用延迟加载?

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

  • 每个线程的会话
  • 每个请求的会话(如果是Web应用程序)
  • 每次会话的会话

参考:http://nhibernate.info/blog/2011/03/02/effective-nhibernate-session-management-for-web-apps.html