web-dev-qa-db-fra.com

Entity Framework 6 + SQLite

J'essaie d'utiliser EF6 alpha et SQLite 1.0.66.0

Mon fichier .config:

<connectionStrings>
   <add connectionString="data source=:memory:;" name="TestDbContext" providerName="System.Data.SQLite" />
</connectionStrings>
<entityFramework>
   <providers>
      <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.66.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
   </providers>
</entityFramework>
<runtime>
   <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
     <dependentAssembly>
        <assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
     </dependentAssembly>
   </assemblyBinding>
</runtime>
<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, Version=1.0.66.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
  </DbProviderFactories>
</system.data>

Quand je cours 

using (var dbContext = new TestDbContext())
{
    if (dbContext.Database.Exists())
    {
        dbContext.Database.Delete();
    }
    dbContext.Database.Create();
}

Je reçois une erreur:

System.InvalidOperationException: System.InvalidOperationException: Le membre 'Instance' du type de fournisseur Entity Framework 'System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version = 1.0.66.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139 ' N'a pas renvoyé d'objet héritant de ' System.Data.Entity.Core.Common.DbProviderServices '. Les fournisseurs Entity Framework Doivent s'étendre à partir de cette classe et le membre 'Instance' doit Renvoyer l'instance Singleton du fournisseur.

Qu'est-ce que je fais mal?

12
nmulyukin

si vous avez utilisé EF 6.1.3 + System.Data.SQLite v1.0.96.0, ajustez (ajoutez) les déclarations suivantes dans le fichier web.config. (vous pouvez trouver la différence avec un outil de comparaison de texte, je les ai numérotés).

    <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
        <parameters>
            <parameter value="mssqllocaldb" />
        </parameters>
    </defaultConnectionFactory>
    <providers>
        <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
        <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" /> 

        <!-- 1. Solves SQLite error of "Unable to find the requested .Net Framework Data Provider."-->
        <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />

    </providers>
</entityFramework>
<system.data>
    <DbProviderFactories>
        <remove invariant="System.Data.SQLite.EF6" />
        <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" /> 

        <!-- 2. Solves SQLite error of "Unable to find the requested .Net Framework Data Provider."-->
        <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>

Ça marche pour moi.

19
tomexou

Le fournisseur System.Data.SQLite Entity Framework devra être mis à jour pour fonctionner avec la version 6 d'Entity Framework. (Voir Reconstruction des fournisseurs EF pour EF6 )

Pour SQLite, il s’agit d’une tâche relativement simple:

  1. Téléchargez et ouvrez le projet System.Data.SQLite.Linq
  2. Supprimer la référence à System.Data.Entity.dll
  3. Ajouter une référence à EntityFramework.dll version 6
  4. Mettre à jour les références d'espace de noms brisées
  5. Reconstruire le fournisseur

Mise à jour du 21 juin 2013: J'ai partagé une version mise à jour du fournisseur sur mon blog. Voir System.Data.SQLite sur Entity Framework 6 pour plus d'informations.

16
bricelam

Je mets la solution de travail de EF 6.0 avec SQLite sur mon compte Bitbucket: https: //[email protected]/zchpit/sqlitesamples.git

ou git https://github.com/zchpit/SQLiteSamples

Vous pouvez télécharger une solution opérationnelle à partir de ce référentiel git. Dans ma solution, je me connecte à SQLite par:

  • Lecteur de données
  • Simple.Data
  • EF 6.0

p.s. mon App.config

<?xml version="1.0"?>
<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="true" />
  </configSections>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client" />
  </startup>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Data.SQLite" publicKeyToken="db937bc2d44ff139" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.0.96.0" newVersion="1.0.96.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite.EF6" />
      <add name="SQLite Data Provider" invariant="System.Data.SQLite" description="Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <add name="SqlLiteContext" connectionString="Data Source=|DataDirectory|MyDatabase.sqlite" providerName="System.Data.SQLite" />
  </connectionStrings>
  <entityFramework>
    <providers>
      <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6"/>
    </providers>
    <defaultConnectionFactory type="System.Data.SQLite.SQLiteFactory, EntityFramework">
      <parameters>
        <!---parameter value="v11.0" />-->
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
</configuration>
6
zchpit

System.Data.SQLite 1.0.91.0 a été mis à jour pour prendre en charge EF6. Merci beaucoup pour l'excellent tutoriel et mise à jour de EF SQLite de Brice. Vous devez mettre à jour votre application.config pour les nouvelles modifications si vous voulez que cela fonctionne avec le tutoriel. Je peux confirmer que cela a fonctionné pour moi sur VS 2010:

<?xml version="1.0"?>
<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.LocalDbConnectionFactory, EntityFramework">
  <parameters>
    <parameter value="v11.0"/>
  </parameters>
</defaultConnectionFactory>
<providers>
  <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6, Version=1.0.91.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
</providers>
</entityFramework>
<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, Version=1.0.91.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
</DbProviderFactories>
</system.data>
<connectionStrings>
<add name="ChinookContext" connectionString="Data Source=|DataDirectory|Chinook_Sqlite_AutoIncrementPKs.sqlite" providerName="System.Data.SQLite"/>
</connectionStrings>
</configuration>
1
Drexter

L'exception a disparu lors de la réinstallation du package NuGet (System.Data.SQLite version 1.0.94.1) avec

Package de mise à jour –réinstallez System.Data.SQLite

1
Riga