Nhibernate 会话。获取<;T>;急装

Nhibernate 会话。获取<;T>;急装,nhibernate,lazy-loading,eager-loading,Nhibernate,Lazy Loading,Eager Loading,我知道有很多关于NHibernate上的急切加载和懒惰加载的言论和帖子。我已经阅读了所有(谎言!)的线程、帖子和答案,这些帖子和答案告诉我为什么应该或不应该在映射时使用“lazy=false”,或者当我认为是一个好地方时,如何使用HQL或条件来急切地加载对象。尽管如此,在使用ISession.Get方法时,我还没有发现任何关于急切加载集合属性的信息。让我解释一下情况: 我想使用一个通用存储库(所有其他专用子类的基础),它如下所示: class Repository<T> { pu

我知道有很多关于NHibernate上的急切加载和懒惰加载的言论和帖子。我已经阅读了所有(谎言!)的线程、帖子和答案,这些帖子和答案告诉我为什么应该或不应该在映射时使用“lazy=false”,或者当我认为是一个好地方时,如何使用HQL或条件来急切地加载对象。尽管如此,在使用ISession.Get方法时,我还没有发现任何关于急切加载集合属性的信息。让我解释一下情况:

我想使用一个通用存储库(所有其他专用子类的基础),它如下所示:

class Repository<T>
{
  public T GetById(long id)
  {
    using (ISession session = NHibernateHelper.OpenSession())
    {
      return session.Get<T>(id);
    }
  }
}
类存储库
{
公共T GetById(长id)
{
使用(ISession session=NHibernateHelper.OpenSession())
{
返回会话.Get(id);
}
}
}
我的问题是:是否有任何方法可以使用通用的“GetById”方法(如上所述),甚至使用它加载的所有对象

我知道有些人会回答“只使用NHibernateUtil.Initialize”,但为此,我必须“知道”我的实体,在这种情况下,我将不得不重写我的方法,并失去我的存储库的一般优势。使用HQL或Criteria或其他任何不使用“Get”的简单性的方式也可以这样说。此外,我还想了解Get(或Load)方法()的其他优点


有什么想法吗?我丢了什么东西吗?我不知道我在说什么吗(很可能)?

简单-不要使用存储库;而是直接使用
ISession
对象。原因如下——这只是会话的错误使用模式。您不应该在存储库中打开和关闭会话,更不用说返回单个值了。请看:这可能会引导您走向正确的方向。@DiegoMijelshon:在一个更大的应用程序中,在某个时候,会请求向用户显示Customer类的一个对象。该请求将在某个时候到达服务器,服务器将没有其他选择,只能打开会话,获取对象并返回,对吗?是和否。管理会话是基础结构层的责任(取决于应用程序类型),而不是存储库。简单-不要使用存储库;而是直接使用
ISession
对象。原因如下——这只是会话的错误使用模式。您不应该在存储库中打开和关闭会话,更不用说返回单个值了。请看:这可能会引导您走向正确的方向。@DiegoMijelshon:在一个更大的应用程序中,在某个时候,会请求向用户显示Customer类的一个对象。该请求将在某个时候到达服务器,服务器将没有其他选项,只能打开会话,获取对象并返回,对吗?是和否。管理会话是基础结构层(取决于应用程序类型)的责任,而不是存储库的责任。