Структура Entity Вызов "Чтение" при закрытии datareader

У меня была разбивка моего веб-хостинга. Теперь, наконец, все снова, и я еще не знаю, что фиксировали техники. Проблема в том, что я получаю сообщение об ошибке:

Calling 'Read' when the data reader is closed is not a valid operation. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidOperationException: Calling 'Read' when the data reader is closed is not a valid operation.

Source Error: 

 An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. 

    Stack Trace:   

[InvalidOperationException: Calling 'Read' when the data reader is closed is not a valid operation.]
   System.Data.Common.Internal.Materialization.Shaper`1.StoreRead() +93
   System.Data.Common.Internal.Materialization.SimpleEnumerator.MoveNext() +30
   System.Linq.Enumerable.Single(IEnumerable`1 source) +119
   System.Data.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__2(IEnumerable`1 sequence) +5
   System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle(IEnumerable`1 query, Expression queryRoot) +25
   System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute(Expression expression) +43
   System.Linq.Queryable.Count(IQueryable`1 source) +240
   BusinessLayer.Car.GetCarCount() in xxx
   UserControls_SiteInfo.Page_Load(Object sender, EventArgs e) +225
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35
   System.Web.UI.Control.OnLoad(EventArgs e) +99
   System.Web.UI.Control.LoadRecursive() +50
   System.Web.UI.Control.LoadRecursive() +141
   System.Web.UI.Control.LoadRecursive() +141
   System.Web.UI.Control.LoadRecursive() +141
   System.Web.UI.Control.LoadRecursive() +141
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627

Я ничего не изменил, так это могут быть некоторые разрешения? Я все равно могу войти в мою базу данных с теми же учетными данными, чтобы не была информация для входа. У кого-нибудь есть идея?

UPDATE: я обнаружил, что получаю ошибку, когда пытаюсь преобразовать IQuery в список. Я никогда не получал ошибку раньше, не дает ли это кому-нибудь понять, что может быть неправильным?

Ответ 1

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

Преобразование запроса в IList заставит запрос выполнить. Если контекст данных закрыт в этот момент, вы получите сообщение об ошибке.

Я не могу объяснить, почему вы не получили этого раньше, если вы не изменили какой-либо код, но это то, на что я бы посмотрел.

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

Ответ 2

У меня была эта ошибка, и это оказалось ошибкой согласованности в базе данных SQL. Я подтвердил это, выполнив запрос в SQL Management Studio в таблицах, участвующих в соответствующей строке, и хотя я получил данные назад, также появилось сообщение об ошибке, которое сообщило о проблеме. Я предполагаю, что подобные вещи могут произойти с Entity Framework, работающими с другими базами данных.

Ответ 3

Я начал получать эту ошибку после того, как компьютер неожиданно отключился. После прочтения этой темы ответ Джеймса Эллиса-Джонса привел меня к использованию SQL-профайлера, чтобы заставить SQL выполняться при вызове .ToList(), и я запустил SQL в SQL Server Management Studio. Это сообщение, возвращаемое SQL Server:

SQL Server обнаружил ошибку ввода-вывода на основе логической последовательности: некорректная контрольная сумма (ожидается: 0xb6a6f70e; фактическая: 0xb6a74f0e). Это произошло во время чтения страницы (1: 50284) в ID базы данных 5 со смещением 0x000000188d8000 в файле "D:\Work\DATABASES\SQL2008R2\xxxxx.mdf". Дополнительные сообщения в журнале ошибок SQL Server или системном журнале событий могут предоставить более подробную информацию. Это серьезное условие ошибки, которое угрожает целостности базы данных и должно быть исправлено немедленно. Завершите полную проверку целостности базы данных (DBCC CHECKDB). Эта ошибка может быть вызвана многими факторами; для получения дополнительной информации см. электронную документацию по SQL Server.

Итак, в моем случае неожиданное завершение работы оставило базу данных в несогласованном состоянии. Я смог успешно восстановить резервную копию базы данных, и ошибка исчезла.