Сессия закрыта - Замок ActiveRecord - PullRequest
0 голосов
/ 24 февраля 2011

Что здесь не так?

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 ошибка "Сессия закрыта"

Ответы [ 2 ]

3 голосов
/ 24 февраля 2011

Дело в том, что фактический запрос не выполняется в этой строке:

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);
}
3 голосов
/ 24 февраля 2011

Запрос фактически выполняется при запуске result.Count() (запросы LINQ выполняются лениво), но SessionScope к этому времени уже был удален.

Если это веб-проект, используйте SessionScope в области HTTP-запроса .

...