如何将NHibernate会话设置为即时获取

如何将NHibernate会话设置为即时获取,nhibernate,Nhibernate,我的测试基类中有一个方法助手,如下所示: protected TEntity Fetch<TEntity>(Guid id) where TEntity : Entity { using (var session = GetSession()) return session.Get<TEntity>(id); } 受保护的TEntity获取(Guid id),其中TEntity:实体 { 使用(var session=GetSession())

我的测试基类中有一个方法助手,如下所示:

protected TEntity Fetch<TEntity>(Guid id) where TEntity : Entity
{
    using (var session = GetSession())
        return session.Get<TEntity>(id);
}
受保护的TEntity获取(Guid id),其中TEntity:实体
{
使用(var session=GetSession())
返回会话.Get(id);
}
因此,我可以从集成测试中调用它:

var persistedFoo = Fetch<Foo>(foo.Id);
var persistedFoo=Fetch(foo.Id);

我如何在Fetch方法中设置会话,以便立即获取所有属性

根据NHibernate文档,您应该使用NHibernateutibility类,因此将代码更改为以下内容应该会有所帮助:

using(var session = GetSession())
{
    var entity = session.Get<TEntity>(id);
    NHibernateUtil.Initialize(entity);   
}
使用(var session=GetSession())
{
var entity=session.Get(id);
初始化(实体);
}

或者,您可以使用nHib的一个查询API(我个人更喜欢QueryOver)来执行类似
session.QueryOver().Where(cat=>cat.Id==Id).Fetch(c=>c.Kittens.Eager

这为您提供了额外的好处,可以精确控制将获取哪些属性/集合

此外,建议您不要将
i会话
在存储库中的用法抽象出来。

这将使您无法从诸如批处理(参见ayende的帖子)等nHibernate功能中获益。

很高兴了解NHibernateUtil。你的答案听起来很有希望,但并不像你建议的那样有效。根据链接到的文档,您必须实际指定要初始化的道具(例如:NHibernateUtil.initialize(foo.bar)//将在foo中初始化Bars集合)。在我的例子中,Fetch方法不知道tenty的诀窍,所以我不能使用这种方法。我可以用反射来解决这个问题,但我希望有一个更直接的选择。正如我在对Hadi回答的评论中提到的,问题是在我的例子中Fetch()是泛型的,所以它不知道它处理的是什么类型。因此,我无法应用.Fetch(c=>c.Kittens)方法。如果你读过我链接的帖子(以及同一作者的其他几篇文章),我想你会确信你实际上并不需要这些。实际上,您要完成的是在nHibernate之上构建另一个抽象级别。我相信这是完全没有必要的。我知道你的意思。正如我在问题中提到的,这只是单元测试的一种“方便”方法。这绝对不能用于应用程序代码中。