Вы получаете контекст вашей базы данных извне контроллера через его конструктор. Если вы хотите использовать этот шаблон, сделайте так, чтобы внешний вызывающий отвечал за удаление контекста, когда закончите. Не используйте ключевое слово using
при использовании этой стратегии.
В частности, вы получаете сообщение об ошибке, потому что возвращаемый вами IEnumerable оценивается лениво (то есть он не оценивается до тех пор, пока не будет необходим). Вызывающий код не может перебирать IEnumerable до тех пор, пока mc
не будет удален из-за выхода из области действия оператора using
.
Одно из решений состоит в том, чтобы метод создал свой собственный контекст и материализовал ответ перед его возвратом. Это хорошо работает, когда общее количество возвращаемых объектов довольно мало и может быть достигнуто путем добавления .ToList()
после вызова.
using (MeSeeksContext mc = new MeSeeksContext() ){
return mc.myTable.Where(x=>x.id==lgid).ToList();
}
Если вы возвращаете большое количество элементов, вы можете правильно следовать шаблону получения экземпляра контроллера от вызывающей стороны (альтернативно, вы можете выделить его как поле контроллера и убедиться, что он удаляется при экземпляре контроллера утилизируется). Если вы идете по этому пути, не используйте в своем методе оператор using
. Используйте _mc
return _mc.myTable.Where(x=>x.id==lgid);