Recentemente ho aggiornato / aggiornato Entity Framework in un vecchio progetto dalla versione 4 o 5 alla versione 6. Ora ottengo questa eccezione:
Un'eccezione di tipo "System.InvalidOperationException" si è verificata in EntityFramework.dll ma non è stata gestita nel codice utente
Ulteriori informazioni: Nessun provider di Entity Framework trovato per il provider ADO.NET con nome "System.Data.SqlClient" non valido. Assicurarsi che il provider sia registrato nella sezione "entityFramework" del file di configurazione dell'applicazione. Vedere http://go.microsoft.com/fwlink/?LinkId=260882 per ulteriori informazioni.
Ho cercato su Google l'errore e ho trovato un paio di thread SO, ma nessuno di loro conteneva una soluzione che funzionasse per me. Questo è come appare il mio App.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
</configuration>
Ho già disinstallato Entity Framework dal mio progetto e lo ho reinstallato, cancellato tutti i riferimenti ai vecchi file EF e reinstallato, ma nulla funziona per me. Continuo a ricevere questo errore.
Ok, questo è abbastanza strano. Ho un paio di progetti: uno è un progetto UI (un progetto ASP.NET MVC) e gli altri sono progetti per cose come repository. Il progetto di repository aveva un riferimento a EF, ma il progetto di interfaccia utente no (perché non ne aveva bisogno, bastava fare riferimento agli altri progetti). Dopo aver installato EF per il progetto UI, tutto ha iniziato a funzionare. Questo è il motivo per cui ha aggiunto questo pezzo di codice al mio Web.config:
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
Ho avuto questo problema in una situazione in cui ho un progetto di modello che ha i riferimenti a EntityFramework e agli assembly .SqlServer e un progetto di UI separato che utilizza ASP.NET MVC. Volevo passare da EF 4.1 a 6.1. In realtà dovevo fare parte di ciò che è stato descritto qui: http://robsneuron.blogspot.com/2013/11/entity-framework-upgrade-to-6.html . Voglio sottolineare che non ho aggiunto un riferimento a questi progetti al mio progetto di interfaccia utente né ho aggiunto la configurazione al web.config del progetto dell'interfaccia utente, in quanto tali passaggi violerebbero la mia separazione di preoccupazioni.
Quello che ho fatto è stato nel mio progetto di modello, ho dovuto capovolgere le impostazioni di riferimento "Copia locale" per EntityFramework.SqlServer (e il riferimento EntityFramework, per sicurezza) su "False" e salvare tutto, per far sì che il progetto inserisca Nodo <Private>
nel file .csproj, quindi reimpostarlo su "Vero" e salvare nuovamente, in modo che True venga considerato come valore finale.
Ho anche dovuto aggiungere la linea di hacking alla mia classe DbContext
nel suo costruttore per forzare l'uso dell'assembly, anche se la linea non fa nulla. Entrambi questi passaggi ho imparato dal post del blog.
public MyContext : DbContext
{
public MyContext() : base("name=MyContext")
{
// the terrible hack
var ensureDLLIsCopied =
System.Data.Entity.SqlServer.SqlProviderServices.Instance;
}
Voglio ringraziare l'autore di quel blog a cui ho fatto riferimento, così come tutte le persone che hanno chiesto e risposto alle domande su SO, per cercare di aiutarci a superare questo terribile bug.