2010-09-15 32 views
2

我刚刚将我的应用程序从LINQ2SQL转换为NHibernate,我试图弄清楚如何优化下面的例子。我尝试使用.Future方法,但是当我的会话关闭视图,然后尝试获取数据,我得到一个会话关闭错误。优化NHibernate查询的任何想法? (.Future)

有没有人知道这种事情的最佳做法?我有很多场景,我在LINQ中调用一个使用NHibernate获取数据的方法,但我不想返回不需要的大量数据。

方法来获取所有的书:

public IEnumerable<Book>GetAllBooks() 
     { 
      try 
      { 
       using (ISession session = NHibernateHelper.OpenSession()) 
       { 
        return session.CreateCriteria<Widget>().ToList<Book>(); 
       } 
      } 
      catch (Exception ex) 
      { 
       //Error stuff here 
      } 
     } 

方法则扩展了该功能

 public IEnumerable<Book> GetDefaultBookReadingList() 
     { 
      return from p in GetAllBooks() 
        where p.IsDefault 
        select p; 
     } 

回答

1

一旦你关闭会话(这发生在你的using块的末尾,你赢了无法检索任何延迟加载的数据

根据应用程序类型的不同,会话管理会有所不同,但版本库应该是NEV ER打开和关闭会话。

在Web应用程序中,最常见的模式是session-per-request。

在Windows应用程序,它可以交谈的每商业交易,或者在简单的实现,会议每视图(模型)

+0

所以我应该在哪里打开和关闭我的会议呢?在服务层?我不是很喜欢将会话对象传递给每个函数,并且您只能一次打开一个会话,所以如果我在使用多个回购时使用回购声明传递它,它将无法很好地工作? – Andrew 2010-09-16 08:33:50

+0

你能解释一下吗? – LiamB 2010-09-16 09:42:46

+0

存储库应该使用SessionFactory进行初始化,并使用'GetCurrentSession()'来获取会话。例如,绑定/解除绑定当前会话可以在Web应用程序的BeginRequest/EndRequest上完成。 – 2010-09-16 14:36:57