Entity framework Chiamando "Read" quando il datareader è chiuso

entity-framework

Domanda

Ho avuto un guasto sul mio webhost. Ora finalmente è di nuovo in su, e devo ancora sapere cosa hanno riparato i tecnici. Il problema ora è che ricevo l'errore:

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

Non ho cambiato nulla, quindi potrebbero esserci delle autorizzazioni? Posso ancora accedere al mio database con le stesse credenziali quindi non sono le informazioni di accesso. Qualcuno ha un'idea?

AGGIORNAMENTO: ho scoperto che ottengo l'errore quando provo a convertire IQuery in un elenco. Non ho mai ricevuto l'errore prima, questo suggerisce a qualcuno di voi cosa potrebbe essere sbagliato?

Risposta accettata

Il framework dell'entità utilizza la valutazione lazy. Ciò significa che la query non viene effettivamente eseguita contro il database al momento della sua creazione, ma viene eseguita quando si ha effettivamente bisogno dei dati. Di conseguenza, il contesto dei dati deve essere ancora aperto quando si elabora la query.

La conversione della query in un IList costringerà la query a essere eseguita. Se il contesto dei dati viene chiuso a questo punto, si otterrà un errore come questo.

Non riesco a spiegare perché non hai ottenuto questo prima se non hai cambiato alcun codice, ma questo è quello che guarderei.

Forse inserisci il tuo codice, questo potrebbe aiutare a diagnosticare il problema.


Risposta popolare

Ho iniziato a ricevere questo errore dopo che il mio computer si è spento in modo imprevisto. Dopo aver letto questo thread, la risposta di James Ellis-Jones mi ha portato a utilizzare SQL profiler per ottenere l'SQL in esecuzione quando è stato chiamato .ToList () e ho eseguito l'SQL in SQL Server Management Studio. Questo è il messaggio restituito da SQL Server:

SQL Server ha rilevato un errore di I / O basato sulla coerenza logica: checksum errato (atteso: 0xb6a6f70e; actual: 0xb6a74f0e). Si è verificato durante la lettura della pagina (1: 50284) nell'ID 5 del database all'offset 0x000000188d8000 nel file "D: \ Work \ DATABASES \ SQL2008R2 \ xxxxx.mdf". Ulteriori messaggi nel log degli errori di SQL Server o nel log degli eventi di sistema possono fornire maggiori dettagli. Questa è una grave condizione di errore che minaccia l'integrità del database e deve essere corretta immediatamente. Completare un controllo di coerenza del database completo (DBCC CHECKDB). Questo errore può essere causato da molti fattori; per ulteriori informazioni, vedere la documentazione in linea di SQL Server.

Quindi nel mio caso, l'arresto imprevisto ha lasciato il database in uno stato incoerente. Sono stato in grado di ripristinare correttamente un backup del database e l'errore è andato via.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché