2013-12-13 19 views
8

Sto scrivendo un'applicazione C# che utilizza file SQL Server CE 4.0, ai quali si accede tramite Entity Framework 6.0 tramite codice prima. (L'applicazione deve essere in grado di utilizzare le DLL locali per la connessione SQL Server CE, ovvero l'applicazione deve essere distribuita XCOPY). L'applicazione funziona bene sulla mia macchina di sviluppo, ma su altre macchine (ad esempio VM con un solo Win7 e .NET 4.0), ottengo un ArgumentException:Codice Entità Framewok Primo "Provider ADO.NET non trovato" con DLL SQL Server CE locali

Il provider ADO.NET con nome invariante 'System.Data.SqlServerCe .4.0 'non è registrato nel file di configurazione della macchina o dell'applicazione, o non può essere caricato. Vedi l'eccezione interna per i dettagli.

Il messaggio di eccezione interna dice:

Impossibile trovare il richiesto provider di dati .NET Framework. Non può essere installato.

Ho cercato Google e SO e la maggior parte dei commenti indica che il file App.config è corretto. Credo che il mio è (fabbrica di connessione predefinita e sezioni provider), ma qui ci sono i contenuti:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    </configSections> 
    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" /> 
    </startup> 
    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework"> 
     <parameters> 
     <parameter value="System.Data.SqlServerCe.4.0" /> 
     </parameters> 
    </defaultConnectionFactory> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
     <provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact" /> 
    </providers> 
    </entityFramework> 
</configuration> 

La cartella di build include i seguenti file (in aggiunta ai file specifici dell'applicazione, ovviamente):

  • EntityFramework.dll
  • EntityFramework.xml
  • EntityFramework.SqlServer.dll
  • EntityFramework.SqlServer.xml
  • 012.351.641.061.
  • EntityFramework.SqlServerCompact.dll
  • EntityFramework.SqlServerCompact.xml

In ciascuna delle amd64 e x86 sottocartelle sono i seguenti file:

  • sqlceca40.dll
  • sqlcecompact40.dll
  • sqlceer40EN.dll
  • sqlceme40.dll
  • sqlceqp40.dll
  • sqlcese40.dll

Sono certo il programma viene eseguito sulla macchina di sviluppo perché SQL Server CE è stato installato, ma come faccio a farlo funzionare utilizzando solo del locale dll SQL Server CE sulla altre macchine?

+1

Vedere il mio post del blog qui: http://erikej.blogspot.dk/2013/11/entity-framework-6-sql-server-compact-4_25.html – ErikEJ

+0

ErikEJ: Ho perso il tuo commento e sono andato alle risposte , ma sembra che tu abbia anche la risposta. Questo sembra un tutorial completo per chiunque partendo da zero. – Tim

+0

@ErikEJ dopo l'aggiornamento a .net framework 4.5.2 il progetto si interrompe. p.s Ho scaricato il tuo progetto e questo dà lo stesso errore – Shekhar

risposta

20

Vedi http://tech.aendeavors.com/2011/06/09/bin-deploy-sqlce-4-0-and-ef-4-1/

Sembra che i bit rilevanti si potrebbe essere mancanti sono:

  • Assicurarsi System.Data.SqlServerCe viene fatto riferimento e impostato su "Copia locale" nelle proprietà.

  • aggiungere quanto segue app.config:


<system.data> 
    <DbProviderFactories> 
     <remove invariant="System.Data.SqlServerCe.4.0" /> 
     <add name="Microsoft SQL Server Compact Data Provider 4.0" 
      invariant="System.Data.SqlServerCe.4.0" 
      description=".NET Framework Data Provider for Microsoft SQL Server Compact" 
      type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/> 
    </DbProviderFactories> 
</system.data> 
+1

Sono tornato indietro e ho controllato i riferimenti per commento di Tico (vedi la mia risposta), che non ha funzionato. Aggiungendo ciò che hai suggerito al file App.Config, l'ho risolto, ma penso che entrambi fossero necessari (l'articolo collegato non specifica quali gruppi hanno bisogno dei riferimenti). Per chiunque si chieda (non ho problemi con il file App.Config), questo va direttamente in . – Tim

+1

Posso confermare il commento sopra – mCasamento

4

stavo affrontando lo stesso problema di oggi.
Dopo aver reinstallato EF più volte, ciò che ha risolto il mio problema era fare riferimento a EF nel mio progetto Console insieme al progetto DAL (quello che utilizza effettivamente EF).

Se si utilizza un riferimento che a sua volta fa riferimento a EF, è necessario aggiungerlo anche a questo progetto.

+0

Sono tornato indietro e ho controllato e aggiunto (via NuGet) EntityFramework e EntityFramework SQL Server Compact a ciascun assembly. Tuttavia, questo non ha risolto il problema. Dopo aver aggiunto il file App.Config per il commento di Nekno, ha funzionato. Penso che entrambi siano richiesti, ma non sono tornato indietro e ho annullato per essere sicuro. – Tim

+0

@Tim, ho dimenticato il 'App.config'. Hai assolutamente ragione! – Tico

0

Ho avuto lo stesso problema e niente ha funzionato per me. L'unica cosa che mi ha risolto questo problema è stata la disinstallazione di da SQL Server Compact dalla mia macchina (tramite aggiungi/rimuovi programmi) e reinstallarla.

+0

Commentando qui per mio conto, ancora. Questa stessa cosa mi è successa di nuovo perché ho dovuto rimuovere e reinstallare .NET Targeting Packs e ha rovinato tutti i miei progetti di Visual Studio. Ancora una volta, l'unica cosa che ha funzionato è stato disinstallare SQL Server Compact e reinstallarlo. – dmathisen

2

Ci scusiamo per il ritardo di risposta - in realtà, c'è una soluzione molto semplice:

Se si esamina i pacchetti cartella \ EntityFramework.6.1.3 \ lib \ net45, si noterà che c'è un'altra dll che è già in là - EntityFramework.SqlServer.

Basta aggiungere un riferimento a questo e tutto funzionerà.

Problemi correlati