如何在事务中将NHibernate中的检索操作放入?

时间:2012-08-31 10:41:26

标签: c# nhibernate transactions

将所有数据库调用放入事务似乎是最佳做法。所以,我想在事务中添加一个select操作,但我找不到如何执行此操作。

我已尝试过此代码,但收到错误:

using (var session = GetSession().SessionFactory.OpenSession())
using (var transaction = session.BeginTransaction())
{
    // var session = GetSession();
    var result = session.Query<I>().Where(condition);

    transaction.Commit();

    return result;
}

错误:

  

会话已结束!   对象名称:'ISession'。

1 个答案:

答案 0 :(得分:3)

这不是Transaction本身的问题,虽然我只使用事务进行保存/更新调用,而不是选择,但这可能是一个偏好问题(或者我根本不知道重要的事情)。 / p>

问题是,在关闭会话之前,你并没有'实现'集合。 这应该有效:

var result = session.Query<I>.Where(condition).List();

return result;

Where本身没有做任何事情。这意味着你只是推迟过滤器的执行,直到用它做某事 - 例如迭代它。如果那时你已经超出Session范围(而且似乎是),那么你将获得异常,因为在会话关闭时你无法调用数据库。

虽然您可能将无法首先访问延迟加载的子项目,但是当您不在内部时,您无法通过代理调用数据库公开会议。 :)

声明

顺便说一下,在使用LINQ的EF中会发生同样的事情:

Fetch