Экземпляр ObjectContext был удален и больше не может использоваться для операций, требующих подключения - PullRequest
5 голосов
/ 29 марта 2011

Я занимаюсь разработкой службы данных WCF.когда я пытаюсь получить доступ к нему со стороны клиента, я получаю следующее исключение:

Экземпляр ObjectContext был удален и больше не может использоваться для операций, требующих подключения.

код:

[WebGet]
public IQueryable<Student> GetUsersByClassId(string classId)
{
    Check.Argument.IsNotEmptyOrNull(classId, "classId");

    using (var db = new schoolContext(connectionString))
    {
        ((IObjectContextAdapter)db).ObjectContext.ContextOptions.ProxyCreationEnabled =  false;
        ((IObjectContextAdapter)db).ObjectContext.ContextOptions.LazyLoadingEnabled = false;

        var studentQry = from s in db.Student.Include("Class")
                         where s.Class.Id == classId
                         select s;

        if(studentQry == null) 
            return new List<Student>().AsQueryable();
        else 
           return studentQry;
}

Ответы [ 4 ]

15 голосов
/ 29 марта 2011

Я подозреваю, что проблема в коде, помеченном ..., который вы не показываете.

Убедитесь, что полностью оценили ваш запрос, прежде чем его вернуть. Например, вместо того, чтобы просто делать:

return studentQry;

Попробуйте сделать:

return studentQry.ToList();

Edit:

Теперь, когда вы изменили свой вопрос, чтобы отразить, что вы возвращаете IQueryable<T> вместо IEnumerable<T>, появилась отдельная проблема. Возвращая IQueryable<T> из вашего метода, вы предполагаете, что тип может быть «запрошен» непосредственно на стороне сервера.

Однако WCF сериализует это по проводам и нуждается в конкретном типе реализации. IEnumerable<T> разрешено, но не IQueryable<T>. Вы должны переключить его на тип, который будет полностью оценивать, чтобы результаты могли быть переданы правильно.

6 голосов
/ 29 марта 2011

Это из-за оператора Using.Когда ваша функция заканчивает выполнение, она удаляет контекст объекта.Когда результат IQueryable перечисляется, он пытается использовать удаленный объект, поэтому вы получаете исключение.Удалите используя, позвольте вашей сервисной реализации реализовать IDisposable и утилизируйте контекст вашего объекта в IDisposable.Dispose ()

2 голосов
/ 29 марта 2011

Это ваше использование является причиной этого.DataContext удаляется до оценки запроса linq.Вы можете вернуть studentQry.ToList () и посмотреть, работает ли это.Если это не так, попробуйте

List<Student> retValue;
retValue = studentQry.ToList();
return retValue;

Наконец, это уродливо, но если вы не используете использование, у вас не будет этой проблемы.В конечном итоге он должен быть утилизирован и очищен сборщиком мусора.

2 голосов
/ 29 марта 2011

Вероятно, клиент пытается получить доступ к подчиненному свойству, например, если student.classes - это другая сущность, и вы пытаетесь получить к ней доступ на клиенте.Нужно указать, включить на любые дочерние объекты

...