2009-06-09 45 views
10

我的網絡主機有故障。現在終於重新開始了,我還不知道技術人員修復了什麼。 問題是,現在我收到的錯誤:實體框架在關閉數據傳遞器時調用「讀取」

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

+0

當您執行直接SQL查詢時會發生什麼? (不使用LINQ到SQL) – 2009-06-15 15:16:12

+0

我發現它是我的數據庫或與我的網絡主機的網絡錯誤,所以它與實體框架本身無關。 – Dofs 2009-06-17 07:45:09

+0

將IEnumerable改爲IList解決了我的問題 我從一個sproc中返回了一個複雜的對象 – safhac 2010-02-19 08:14:03

回答

24

實體框架使用惰性評估。這意味着查詢在您創建數據庫時並未針對數據庫實際執行,而是在實際需要數據時執行。因此,在處理查詢時,數據上下文仍然必須打開。

將查詢轉換爲IList將強制查詢被執行。如果數據上下文在這一點關閉,你將會得到這樣的錯誤。

我不能解釋爲什麼你以前沒有得到這個,如果你沒有改變任何代碼,但這是我會看。

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

2

我幾乎有這個錯誤,並且它證明是SQL數據庫中的一致性錯誤。我通過在涉及相關行的表上的SQL Management Studio中運行查詢來確認這一點,雖然我得到了數據,但也有一條錯誤消息告知了此問題。我猜想在運行Entity Framework的其他數據庫時會發生類似的情況。

1

我的電腦意外關閉後,我開始出現此錯誤。閱讀完本主題後,James Ellis-Jones的回答讓我使用SQL profiler來調用.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聯機叢書。

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

相關問題