Entity Framework + SQLite-Bereitstellung

asp.net-mvc entity-framework sqlite system.data.sqlite

Frage

Ich habe eine ASP.NET MVC-App, die die SQLite-Datenbank über Entity Framework verwendet. Alles funktioniert auf dem lokalen Entwicklungs-Webserver von VS 2008.

Die Bereitstellung der Web-App für meinen Dienstanbieter verursacht jedoch diesen Fehler:

[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

Der Dienstanbieter hat erklärt, dass er SQLite nicht unterstützt. Ich hatte jedoch gedacht, dass SQLite unabhängig von den Einstellungen des Service Providers ist, da es App_Data bereitstellen kann.

Hat jemand Erfahrungen mit einer erfolgreichen Implementierung von Entity Framework + SQLite?

Prost, -pom-

Beliebte Antwort

Es ist unwahrscheinlich, dass Sie dies mehr lesen werden, aber Folgendes fehlt in Ihrer app.config (oder für Sie 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>

Insbesondere wenn Sie sqlite in einer Bibliothek verwenden, die mit Ihrer Website verlinkt ist, müssen Sie dies zur Konfigurationsdatei der Website hinzufügen - nicht zur Bibliothek! Das liegt daran, wie Sie den Provider laden: Im Wesentlichen legen Sie zur Laufzeit fest, welche DLL mit der Zeichenfolge "System.Data.SQLite" geladen werden soll, und der geeignete Provider wird über die Einstellungen der Eintragsassembly ermittelt .

Bearbeiten: Übrigens, wenn Sie eine Bibliothek schreiben, die eine Abhängigkeit von sqlite hat, können Sie diese Komplexität vermeiden. Sie müssen DbProviderFactories nicht verwenden, um zur Laufzeit nach sqlite zu suchen. Sie können auch eine Abhängigkeit zur Kompilierzeit in Kauf nehmen, die einfacher zu verwalten ist. Dann können Sie den obigen Abschnitt app.config ignorieren und stattdessen alle Instanzen von ersetzen:

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

mit

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

Wenn Sie dies tun, verwenden Sie einen einfachen Bibliotheksaufruf, um die Verbindung herzustellen, und es gibt keine Laufzeitauswahl des Datenbankanbieters. Das kann weniger flexibel sein, da Sie Datenanbieter nicht mehr über die Konfigurationsdatei austauschen können, aber für viele Bibliotheken reicht das aus. Wenn Sie den Bibliothekscode nicht kontrollieren, ist dies leider keine Option.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum