将所有数据库调用放入事务似乎是最佳做法。所以,我想在事务中添加一个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'。
答案 0 :(得分:3)
这不是Transaction
本身的问题,虽然我只使用事务进行保存/更新调用,而不是选择,但这可能是一个偏好问题(或者我根本不知道重要的事情)。 / p>
问题是,在关闭会话之前,你并没有'实现'集合。 这应该有效:
var result = session.Query<I>.Where(condition).List();
return result;
Where
本身没有做任何事情。这意味着你只是推迟过滤器的执行,直到用它做某事 - 例如迭代它。如果那时你已经超出Session范围(而且似乎是),那么你将获得异常,因为在会话关闭时你无法调用数据库。
虽然您可能将无法首先访问延迟加载的子项目,但是当您不在内部时,您无法通过代理调用数据库公开会议。 :)
声明
顺便说一下,在使用LINQ的EF中会发生同样的事情:
Fetch