Уже открытый DataReader для модели ADO.NET Entity в проекте ASP.NET MVC

Я использую модель ADO.NET Entity для привязки данных и других манипуляций с данными для моего проекта ASP.NET MVC 4 Razor.

Я пытаюсь, в моей модели, связать данные в моем Controller:

http://ideone.com/GvskaG

Когда я доберусь до линии 26:

26. Sender = db.GetLoginByUserId(item.sender_id).FirstOrDefault(),
27. Receiver = db.GetLoginByUserId(item.recv_id).FirstOrDefault(),

Я получаю такую ​​ошибку:

{"Уже существует открытый DataReader, связанный с этим подключением, который должен быть закрыт первым."}

На самом деле, я не понимаю, как закрыть его вручную, потому что ADO.NET Entity является слишком автоматическим, и я не определил, чтобы какие-либо открытия закрывали для DataReader или соединения.

Я думаю, что это может быть из-за 15-й строки:

15. var currentUserId = db.GetUserIdByLogin(Request.Cookies["user-name"].Value);

И модель Entity действительно открывает соединение /DataReader и удаляет их только после фигурной скобки } символ, когда GC собирает мусор.

Похоже, что я могу сделать только один вызов в одном методе, но если я хочу больше вызовов из модели Entity, как это можно сделать?

Спасибо!

1 ответ

Решение

Возможно, вы находитесь в цикле foreach на данный момент? Это обычный способ вызвать это - проповедовать первому читателю, выполняя n+1 (запрос на элемент) внутри цикла. Обычные исправления (одно из):

  • настройте запрос для быстрого извлечения вложенных данных, чтобы они уже были доступны
  • буферизовать внешний цикл в список / массив, чтобы считыватель завершил работу до того, как начнется внутренний цикл
Другие вопросы по тегам