这里有什么问题?
public IQueryable<Customer> GetAllCustomers()
{
using (SessionScope scope = new SessionScope())
{
return scope.AsQueryable<Customer>();
}
}
var result = from x in GetAllCustomers() select x;
Assert.Greater(result.Count(), 0);
System.ObjectDisposedException: 会议结束!对象名称: '的ISession'。
这篇文章对我没有帮助: Castle ActiveRecord error "Session is closed"
答案 0 :(得分:3)
当您运行result.Count()
(LINQ查询被延迟执行)时,实际执行了查询,但是当时已经处理了SessionScope。
如果是网络项目,请使用HTTP-request-scoped SessionScope。
答案 1 :(得分:3)
问题是实际查询没有在这一行中执行:
scope.AsQueryable<Customer>();
因为您只返回一个IQueryable
对象,您可以稍后查询。
因此,当您访问数据时它会被执行:
Assert.Greater(result.Count(), 0);
此时,显然会话已经关闭(退出using
时会关闭)。
其中一种可能的解决方案是将SessionScope
移出GetAllCustomers
方法:
public IQueryable<Customer> GetAllCustomers(SessionScope scope)
{
return scope.AsQueryable<Customer>();
}
using (SessionScope scope = new SessionScope())
{
var result = from x in GetAllCustomers(scope) select x;
Assert.Greater(result.Count(), 0);
}