【问题标题】:Entity framework Calling 'Read' when the datareader is closed [closed]实体框架在数据读取器关闭时调用“读取”[关闭]
【发布时间】:2009-06-09 19:24:35
【问题描述】:

我的虚拟主机出现故障。现在终于又恢复了,我还不知道技术人员修复了什么。 问题是我现在收到错误:

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

我没有改变任何东西,所以它可以是一些权限吗?我仍然可以使用相同的凭据登录我的数据库,因此它不是登录信息。有人有想法吗?

更新:我发现当我尝试将 IQuery 转换为列表时出现错误。我以前从未收到过错误,这是否让你们知道可能出了什么问题?

【问题讨论】:

  • 执行直接 SQL 查询时会发生什么? (不使用 linq-to-sql)
  • 我发现这是我的数据库或我的虚拟主机网络的错误,因此它与实体框架本身无关。
  • IEnumerable 更改为IList 为我解决了这个问题我正在从存储过程中返回一个复杂对象
  • 如果模型中遗漏了属于关系一部分的表,也会发生此错误。即使您不打算使用特定表,如果它与您正在使用的表有关系,也应该将其引入。

标签: entity-framework


【解决方案1】:

实体框架使用惰性求值。这意味着当您创建查询时,它实际上并没有针对数据库执行,而是在您实际需要数据时执行。因此,当您处理查询时,数据上下文必须仍然处于打开状态。

将查询转换为 IList 将强制执行查询。如果此时关闭数据上下文,您将收到类似这样的错误。

如果你没有更改任何代码,我无法解释为什么你之前没有得到这个,但这是我要研究的。

也许发布您的代码,这可能有助于诊断问题。

【讨论】:

  • 为什么这是公认的答案?
  • 指出延迟加载和强制实体框架将内容加载到内存中的问题解决了我的问题。我使用 .ToList() 在查询的托管 EF 上下文被释放之前将查询的结果强制到内存中。
  • 当代码没有任何变化并且webhost出现故障时,它与实体框架无关。该错误可能是由于数据库分配错误或一致性错误而产生的,必须立即纠正数据库。
【解决方案2】:

我的计算机意外关闭后开始出现此错误。阅读此线程后,James Ellis-Jones 的回答使我使用 SQL 分析器在调用 .ToList() 时获取正在执行的 SQL,并在 SQL Server Management Studio 中运行 SQL。这是 SQL Server 返回的消息:

SQL Server 检测到基于逻辑一致性的 I/O 错误:校验和不正确(预期:0xb6a6f70e;实际:0xb6a74f0e)。它发生在读取文件“D:\Work\DATABASES\SQL2008R2\xxxxx.mdf”中偏移量 0x000000188d8000 的数据库 ID 5 中的页面 (1:50284) 期间。 SQL Server 错误日志或系统事件日志中的其他消息可能会提供更多详细信息。这是威胁数据库完整性的严重错误情况,必须立即纠正。完成完整的数据库一致性检查 (DBCC CHECKDB)。这个错误可能是由许多因素引起的;有关详细信息,请参阅 SQL Server 联机丛书。

因此,就我而言,意外关闭导致数据库处于不一致状态。我能够成功恢复数据库备份并且错误消失了。

【讨论】:

    【解决方案3】:

    我几乎遇到了这个错误,结果证明是 SQL 数据库中的一致性错误。我通过在 SQL Management Studio 中对相关行所涉及的表运行查询来确认这一点,虽然我得到了数据,但也有一条错误消息提示该问题。我想在针对其他数据库运行 Entity Framework 时可能会发生类似的事情。

    【讨论】:

    • 谢谢我在数据库中也有问题,事件选择 * 没有工作......错误是消息 605,级别 21,状态 3,第 1 行尝试在数据库中获取逻辑页面 (1:640) 30 次失败。它属于分配单元7946994385574035456而不是72057594046709760。
    猜你喜欢
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    相关资源
    最近更新 更多