實體框架關閉datareader時調用'Read'

entity-framework

我的網站主機上有故障。現在終於再次上升,我還不知道技術人員修復了什麼。問題是現在我收到錯誤:

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轉換為列表時出現錯誤。我之前從未收到過這個錯誤,這是否給了你們任何一個可能出錯的線索?

一般承認的答案

實體框架使用惰性評估。這意味著在創建查詢時實際上不會對數據庫執行查詢,而是在實際需要數據時執行查詢。因此,在處理查詢時,數據上下文仍必須處於打開狀態。

將查詢轉換為IList將強制執行查詢。如果此時數據上下文已關閉,您將收到類似這樣的錯誤。

如果你沒有改變任何代碼,我無法解釋為什麼你之前沒有得到這個,但這就是我要看的。

也許發布您的代碼,這可能有助於診斷問題。


熱門答案

我的計算機意外關機後,我開始收到此錯誤消息。在閱讀了這個帖子之後,James Ellis-Jones的回答讓我使用SQL分析器來調用.ToList()時調用SQL,並在SQL Server Management Studio中運行SQL。這是SQL Server返回的消息:

SQL Server檢測到基於邏輯一致性的I / O錯誤:校驗和不正確(預期:0xb6a6f70e;實際:0xb6a74f0e)。它發生在數據庫ID 5中的頁面讀取(1:50284)期間,文件'D:\ Work \ DATABASES \ SQL2008R2 \ xxxxx.mdf'中的偏移量為0x000000188d8000。 SQL Server錯誤日誌或系統事件日誌中的其他消息可能提供更多詳細信息。這是嚴重錯誤情況,威脅數據庫完整性,必須立即糾正。完成完整的數據庫一致性檢查(DBCC CHECKDB)。這個錯誤可能是由許多因素造成的;有關詳細信息,請參閱SQL Server聯機叢書。

所以在我的情況下,意外關機使數據庫處於不一致狀態。我能夠成功恢復數據庫備份,錯誤消失了。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因