会话已关闭 - Castle ActiveRecord

时间:2011-02-24 15:13:06

标签: .net database nhibernate exception castle-activerecord

这里有什么问题?

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"

2 个答案:

答案 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);
}