Ogni tanto, sto riscontrando la seguente eccezione nella mia applicazione ASP.NET/MVC5/WebAPI2/EF6/MSSQL:
System.InvalidOperationException: il contesto non può essere utilizzato durante la creazione del modello. Questa eccezione può essere generata se il contesto viene utilizzato all'interno del metodo OnModelCreating o se la stessa istanza di contesto è accessibile da più thread contemporaneamente. Si noti che i membri dell'istanza di DbContext e le classi correlate non sono garantiti come thread-safe.
Ho rintracciato questo al mio codice di autorizzazione, che è un derivato di AuthorizeAttribute
e che istanzia il proprio DbContext
per verificare che la chiave API del consumer API Web sia valida (l'errore si verifica quando si prova ad accedere al database).
L' AuthorizeAttribute
a sua volta decora i controller che sono derivati del mio BaseController
, che istanzia anche un DbContext
per il lavoro del controller.
Dopo aver provato a risolvere questo problema per giorni e aver letto questo e ciò, sospetto che la creazione delle due istanze di DbContext
per richiesta sia il problema. Tuttavia, non sono abbastanza sicuro di come posso usare solo una singola istanza per questo lavoro. Il codice del mio controller attualmente crea istantaneamente il DbContext
sulla sua creazione e lo DbContext
in modo trasparente quando il controller stesso dispone. AuthorizeAttribute
è completamente indipendente da tutto ciò e crea il contesto su richiesta per i propri scopi.
Qualsiasi DbContext
/ idea su come conservare / riutilizzare lo stesso DbContext
per entrambe le unità di lavoro?
Ho avuto esattamente lo stesso problema quando ho iniziato con un'applicazione di base utilizzando Entity Framework 6 per la prima volta.
La soluzione migliore per me era garantire una sola istanza di DbContext durante il ciclo di vita della richiesta utilizzando Autofac (con integrazione MVC) e l'ambito di validità di InstancePerRequest di Autofac.
Se sei interessato a percorrere la via di iniezione delle dipendenze (che ti consiglio caldamente) ti consiglierei di familiarizzare con Autofac - e per ulteriori informazioni sul tuo particolare problema consulta la risposta di davidbitton qui - ti porterà sulla giusta strada .