2009-06-09 1 views
10

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 ricevo l'errore:Entity framework Chiamare 'Leggi' quando il datareader è chiuso

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 potrebbe essere alcune 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?

+0

cosa succede quando si esegue una query SQL diretta? (non usando linq-to-sql) –

+0

Ho scoperto che si tratta di un errore con il mio database o con la rete sul mio webhost, quindi non ha nulla a che fare con l'entità stessa. – Dofs

+0

La modifica di 'IEnumerable' in' IList' ha risolto il problema per me Sto restituendo un oggetto complesso da un sproc – safhac

risposta

24

Il framework 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 dati deve essere ancora aperto quando si elabora la query.

Convertire la query in un IList costringerà la query a essere eseguita. Se il contesto dei dati è 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 postare il codice, questo potrebbe aiutare a diagnosticare il problema.

+6

Perché questa è la risposta accettata? – Jeroen

+0

Indirizzare il problema del caricamento lento e forzare Entity Framework a caricare il contenuto in memoria ha risolto il problema.Io uso '.ToList()' per forzare i risultati di una query in memoria prima che fosse disposto il contesto EF di hosting della query. – Zarepheth

2

Avevo praticamente questo errore e si è rivelato un errore di coerenza nel database SQL. L'ho confermato eseguendo una query in SQL Management Studio sulle tabelle coinvolte nella riga in questione e, sebbene avessi recuperato i dati, c'era anche un messaggio di errore che consigliava il problema. Immagino che cose simili potrebbero accadere con Entity Framework in esecuzione su altri database.

+0

Grazie anche a un problema nel database, Event Select * non funzionava ... Errore era Msg 605, Livello 21, Stato 3, Linea 1 Tentativo di recuperare la pagina logica (1: 640) nel database 30 non riuscito. Appartiene all'unità di allocazione 7946994385574035456 non a 72057594046709760. –

1

Ho iniziato a ricevere questo errore dopo che il 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 immediatamente corretta. 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.