2009-02-16 25 views
6

Ho un'app ASP.NET MVC che utilizza il database SQLite tramite Entity Framework. Tutto funziona sul webserver di sviluppo locale di VS 2008.Entity Framework + distribuzione SQLite

Tuttavia, la distribuzione del web app al mio fornitore di servizi di causa questo errore:

[ArgumentException: Unable to find the requested .Net Framework Data Provider. It may not be installed.] 
    System.Data.Common.DbProviderFactories.GetFactory(String providerInvariantName) +1308959 
    System.Data.EntityClient.EntityConnection.GetFactory(String providerString) +35 

Service provider ha commentato che non supportano SQLite. Avevo però che SQLite fosse indipendente dalle impostazioni del fornitore di servizi dal momento che è distribuibile App_Data.

Qualcuno ha esperienza di una implementazione Entity Framework + SQLite di successo?

Cheers, -pom-

risposta

0

Hai provato aggiungendo la DLL richiesto (s) nella directory bin dell'applicazione? Potresti voler vedere l'articolo di Phil Haack su Bin Deploying ASP.NET MVC per le idee su come farlo automaticamente.

+0

Ciao, grazie per una risposta. Sì, ho visto il blogpost di Phil. Posso distribuire la normale app ASP.NET MVC bene. È la combinazione con Entity Framework + SQLite che è problematica. Ho aumentato sia System.Data.Entity.dll che System.Data.SQLite.dll nella cartella bin. Ancora nessuna fortuna. – Pompair

+1

Hmmm. Sono nella sezione delle assemblee nella configurazione Web? – tvanfosson

12

Sei improbabile che possa essere la lettura di più questo, ma ti manca il seguente nel vostro app.config (o, per voi, web.config):

<configuration> 
    <system.data> 
    <DbProviderFactories> 
     <remove invariant="System.Data.SQLite" /> 
     <add name="SQLite Data Provider" invariant="System.Data.SQLite" 
      description=".Net Framework Data Provider for SQLite" 
      type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" /> 
    </DbProviderFactories> 
    </system.data> 
</configuration> 

In particolare, se siete usando sqlite in una libreria che è collegata al tuo sito web, devi aggiungerla al file di configurazione di il sito Web - non la libreria! Questo è dovuto al modo in cui si sta caricando il provider: in sostanza, si determina in fase di esecuzione quale DLL caricare, utilizzando la stringa "System.Data.SQLite" e l'individuazione del provider appropriato viene eseguita utilizzando le impostazioni della voce montaggio.

Edit: A proposito, quando si scrive la libreria che ha una dipendenza SQLite, è possibile evitare questa complessità. Non è necessario utilizzare DbProviderFactories per cercare sqlite in fase di runtime; puoi prendere anche una dipendenza in fase di compilazione, che può essere più facile da gestire. Poi si può ignorare la sezione app.config sopra, e invece sostituire tutte le istanze di:

DbProviderFactories.GetFactory("System.Data.SQLite").CreateConnection() 

con

System.Data.SQLite.SQLiteFactory.Instance.CreateConnection() 

Se lo fa, si sta utilizzando una chiamata di libreria semplice per creare la connessione e non esiste una selezione runtime del provider db. Questo può essere meno flessibile in quanto non è più possibile scambiare provider di dati tramite il file di configurazione, ma per molte librerie è sufficiente. Sfortunatamente, se non controlli il codice della libreria, questa non è un'opzione.

+1

Grazie per la risposta ... – Funky81

+0

Grazie. Questo ha funzionato anche per me: in un'applicazione wpf che faceva riferimento a una libreria di classi con accesso ai dati SQLite. –

0

SQLite richiede l'autorizzazione di trust completo per la distribuzione di applicazioni ASP.NET. Molti provider di hosting condiviso non lo consentono. Potresti non voler controllare questo.