42

Has anyone gotten the new System.Data.SQLite 1.0.91.0 to work with Entity Framework 6 in Visual Studio 201#? If you have, how did you do it?

Update - 20 Mar 2014: System.Data.SQLite 1.0.92.0 has been released but I had no luck creating an EDMX in VS2013 :( I ended up using using Package Manager (because EF6.#.# is a dependency in the new SQLite NuGet package):

uninstall-package entityframework -force

restart VS2013 and put the older EF5 on to get VS2013 to generate an EDMX from an existing database:

install-package entityframework -version 5.0.0

Note: This was not a complex, multi-table SQLite relational database test so I am not sure what other problems will arise if I do use anything with more than a couple Navigation (FK) relationships :/

ANSWER for EDMX/Model First: (Update - 2 Mar 2014) I found a work-around but it is not consistent enough and requires too many steps to consider it a valid solution. Basically:

  • you make all the Class(es) file(s),

  • make a connection to an existing SQLite database with tables,

  • modify the web/app.config to as described by mistachkin in the still outstanding SQLite Trouble Ticket (http://system.data.sqlite.org/index.html/tktview?name=7b8fd3ef77), including faking the cdsl/.ssdl/.msl pieces, and

  • then manually create all the Entity Models in the Designer in an Empty EDMX before rebuilding the project and then...

  • your right click on an Entity and choose 'Update from database'...

Sometimes EF/VS2013 will add the .tt/DbContesxt and sometimes they don't. Way too 'hit or miss' :(

ANSWER for "Code First" with and without an existing SQLite database (based on PMCB, Drexter, and Jimi's suggestions). Note however that you cannot generate any EF models or EDMX files [sic - Conceptual Schema Definition Language (.CSDL), Store Schema Definition Language (.SSDL), and Mapping Specification Language (.MSL)] automatically in Visual Studio 2013. I did not try manually creating the EDMX files to see if they would be palatable to EF and even if I did, it seems to me that doing all the manual creation/mapping/changes/XML edits defeats the whole purpose/concept of a entity based framework...

<connectionStrings>
    <add name="DogsContext" connectionString="Data Source=|DataDirectory|\dogs.s3db;" providerName="System.Data.SQLite" />
</connectionStrings>
<entityFramework>
    <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" />
      <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, Version=1.0.91.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </DbProviderFactories>
</system.data>

Here is the test Class (note that I had to change the DogID to Int64 to get it to work with SQLite...):

using System.Data.Entity;

namespace WebApplication1.Models
{
    public class Dog
    {
        public Dog() { }

        public Int64 DogID { get; set; }
        public string DogName { get; set; }
    }
}

and here is the test DbContext:

using System.Data.Entity;

namespace WebApplication1.Models
{
    public class DogsContext : DbContext
    {
        public DogsContext() : base() { }

        public DbSet<Dog> DogNames { get; set; }
    }
}

============= Original Details of Question ==================

SQLite 1.0.91.0 was released yesterday (http://system.data.sqlite.org/index.html/doc/trunk/www/news.wiki) with "Add support for Entity Framework 6". There is a caveat in the included 'Readme' that has you add the following to the following to web.config/app.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, Version=1.0.91.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </DbProviderFactories>
</system.data>
</configuration>

If you use NuGet in VS2013 to add "System.Data.SQLite (x86/x64)", you now get this line added to web.config/app.config:

<entityFramework>
...
<providers>
<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
</providers>
...
</entityFramework>

As a test, I made a copy of a working NET4.5.1/MVC4/EF5/System.Data.SQlite 1.0.90 application and ran PM: update-package on it. It successfully added the above line to my web.config and I added the required "DbProviderFactories" pieces. Rebuild and run... Fail with 'no provider found'. I try it without the "DbProviderFactories"... Fail with 'no provider found'. I remove the new "provider" piece... Fail with 'no provider found'. So I try a new project but with and without Identity (OWIN) in case that is the problem. Neither work... Pretty much run out of ideas, so asking here after Google/StackOverflow searches.

============ 14 Feb 2014 ===============

Unfortunately the changed entries and numerous variations did not work on my PC... I am using VS 2013 Pro on Win8.1 Pro x64. I reinstalled System.Data.SQLite. At least I am getting a new error with both the existing SQLite database and the new one that VS2013 created (which I can access and see it has a proper structure with zero tables):

"An error occurred connecting to the database. The database might be unavailable. An 
exception of type 'System.Data.Entity.Core.ProviderIncompatibleException' occurred. The 
error message is: Schema specified is not valid. Errors: StoreSchemaDefinition(2,64) : 
Error 0175: The ADO.NET provider with invariant name 'System.Data.SQLite.EF6' is either 
not registered in the machine or application config file, or could not be loaded. See the 
inner exception for details.'"

Both EF6 and System.Data.SQLite (x86/x64) where pulled in via NuGet into brand new MVC Web apps and a Windows Console app. Both produced the above error... I am beginning to suspect that maybe something is wrong with my VS3013 but I do not want to spend another 6 hours downloading and patching it when I can work with MVC4/SQLite/EF5...

===== 17 Feb 2014 ========

@Jimi - No luck here. I tried with NET 4.5 and 4.5.1 with a new MVC and Windows Application Project. I tried with EF6.0.0 and EF6.0.2. I tried replacing the 3x SQLite.Data.xxx.dll refs with local copies from the install of System.Data.SQLite after adding "System.Data.SQLite (x86/x64)" from NuGet . I also tried the NuGet “System.Data.SQLite.MSIL” package instead of adding DBFactories to the various versions of Web.Config and App.Config that I tried.

I also tried creating an NET 4.0 MVC4 Web Application but it appears NuGet’s "System.Data.SQLite (x86/x64)" now includes a requirement for EF6. Being hopeful, I went along with it and tried the various ‘save/create new connection/edit web.config/etc’ but it would not work. I have given up for now and gone back to SQLite with Datasets so I can use Linq with System.Data.DataSetExtensions by making the DataTables "AsEnumerable" (or Java (jdbc) for people that want an offline copy of the database on their Android OS devices with a minimal App interface).

========= 19 Feb 2014 =======

@Christian Sauer - I did not get EF6 and System.Data.SQLite (or System.Data.SQLite.EF6) to work together, yet... but

I just found an update on http://system.data.sqlite.org/index.html/tktview?name=7b8fd3ef77 that says there is a newer SQLite NuGet package:

mistachkin added on 2014-02-19 03:39:35:

All NuGet packages have been updated to 1.0.91.3.  Several fixes are included
that pertain to supporting Entity Framework 6.

I am testing it now with a new Project (MVC Web Project in VS2013 using EF6.0.2 and SQLite 1.0.91.3 that targets .NET 4.5.1)...

No luck again with the new SQLite 1.0.91.3. The web.config has changed to:

  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </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" />
      <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" />
   </DbProviderFactories>
 </system.data>

I am going to try messing with the config after work (as suggested by Jimi and PCMB) and post any findings.

I just tried re-installing both the 32 and then the 64 bit versions of System.Data.SQLite (with and without adding to GAC) but EF6 will not work with SQLite. If I try to manually build the model and mappings, it fails any time I reference/try to use EF6. As for creating Entity Data Models (be it generate from existing SQLite or new SQLite database) it will fail/error out no matter what I do to configs, connections or providers.

=========== 22 Feb 2014 =============

They pulled/rolled-back the System.Data.SQLite 1.0.91.3 update to 1.0.91.0. There is still an outstanding ticket (http://system.data.sqlite.org/index.html/tktview?name=7b8fd3ef77) open that includes some suggestions by mistachkin. Here is the app.config mistachkin recommended trying (this config did not work for me either before or...):

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
  <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" />
     <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, Version=1.0.91.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <add name="northwindEFEntities" connectionString="metadata=res://*/NorthwindModel.EF6.2013.csdl|res://*/NorthwindModel.EF6.2013.ssdl|res://*/NorthwindModel.EF6.2013.msl;provider=System.Data.SQLite.EF6;provider connection string=&quot;data source=.\northwindEF.db&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
  <entityFramework>
    <providers>
     <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6, Version=1.0.91.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </providers>
  </entityFramework>
</configuration>

after I tried mistachkin's suggestion to add the dll's to the GAC (done with .NET "gacutil.exe")...

PWRR2207
  • 33
  • 2
  • 4
  • 9
  • 2
    Did you make any progress? I am stuck with that problem, too... – Christian Sauer Feb 19 '14 at 10:56
  • hey, have you finally got it? please tell your progression... – Kourosh Apr 03 '14 at 06:41
  • No luck with 'EF6.anything' yet. For CRUD apps, I have been using EF5 and for queries I have either used JDBC/ODBC SQL based DAL's with raw returns or building objects palatable to Linq and Razor Views. – PWRR2207 Apr 03 '14 at 14:52
  • If this is still an issue, maybe this answer I posted will work for you (also see the video): http://stackoverflow.com/questions/25089346/database-first-create-entity-framework-6-1-1-model-using-system-data-sqlite-1-0 – TomL Aug 15 '14 at 10:36
  • 22 Feb Solution finally works for me.Thumbs Up – Umar Abbas Jan 29 '15 at 12:49
  • If you have multiple projects, you might need to install the Sqlite dll into each one using the EF context. That will ensure you have the dll deployed with the application, at least. – Kind Contributor Oct 10 '16 at 10:23

14 Answers14

23

I worked on this for several hours today before figuring it out. The NuGet package adds the appropriate entry "System.Data.SQLite.EF6" into the EntityFramework provider factories, but you have to remove or comment out the old "System.Data.SQLite" entry. The EF context builder blows up if any of the provider entries are invalid, and the old 1.0.91 SQLite provider is not supported in EF6.

EDIT: Cleaning up the config allowed my other context objects (SQL Server) to instantiate, but it still won't instantiate the SQLite context objects correctly. The inner exception is

Unable to find the requested .Net Framework Data Provider. It may not be installed.

EDIT 2/SOLUTION Finally figured it out! I think there's an issue in System.Data.SQLite that is forcing a reference to the System.Data.SQLite provider name rather than the value provided in the connection string. I was able to work around this by creating two entries in the EntityFramework provider section, one named "System.Data.SQlite", and one named "System.Data.SQLite.EF6", but both providers actually use the EF6 provider.

<entityFramework>
...
<providers>
    <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6, Version=1.0.91.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    <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>

pmcb
  • 349
  • 2
  • 7
  • Aye :( I just tried adding the references directly from the installed version (EF and SQLite dll's) but to no avail. Going to try from a new/clean project later... – PWRR2207 Feb 14 '14 at 00:00
  • New project did not work either so hopefully someone like Brice Lambson reads this and tries to figure it out :/ – PWRR2207 Feb 14 '14 at 17:50
  • Check my second edit. I got it working with duplicate entries in the providers section. – pmcb Feb 14 '14 at 19:56
  • I am having the same problem. Can you post the complete app.config file contents? – Yiannis Mpourkelis Feb 14 '14 at 21:30
  • 1
    Thank you for trying but no luck :( At least I am getting a new error citing System.Data.Entity.Core.ProviderIncombatibleException with both existing (working) databases and valid new ones created by VS2013... Reinstalled System.Data.SQLite and tried a bunch of other stuff to no avail. At least MVC4/SQLite/EF5 still work :/ – PWRR2207 Feb 14 '14 at 21:33
10

Here is my whole config file. I am running EF 6.0.2 with SQLite 1.0.91. I haven't tried the model generator yet, but my context objects work fine, and I have tested insert/update/delete via the context as well as direct SQL commands via the dbcontext. The trick is in the entityFramework/providers section. I had to duplicate the SQLite provider entries for the EF6 provider, but use the old and new invariant names.

    <?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" />
    <section name="electra.common.configuration.electraConfiguration" type="Electra.Common.Configuration.ElectraConfiguration, Electra.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" allowDefinition="Everywhere" allowExeDefinition="MachineToApplication" restartOnExternalChanges="true" />
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
  </startup>
  <connectionStrings>
    <add name="DBContext_Server" 
        connectionString="server=sunset\sql2012;Integrated Security=SSPI;database=Electra;Pooling=true;max pool size=1000;min pool size=5;Connection Lifetime=30;connection timeout=15" 
        providerName="System.Data.SqlClient" />
    <add name="DBContext_ElectraPOS" 
        connectionString="Data Source=D:\Electra\ElectraWeb\PosEngine.Repository\ElectraPOS.db" 
        providerName="System.Data.SQLite.EF6" />
  </connectionStrings>
    <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" />
            <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, Version=1.0.91.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
        </DbProviderFactories>
    </system.data>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <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, Version=1.0.91.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
        <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>
  <electra.common.configuration.electraConfiguration>
    <logging>
      <levels info="true" warning="true" error="true" debug="true" />
    </logging>
  </electra.common.configuration.electraConfiguration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.1.0.0" newVersion="2.1.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.0.2.0" newVersion="2.0.2.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>
pmcb
  • 349
  • 2
  • 7
  • It was adding the System.Data.SQLite with the System.Data.SQLite.EF6 that got my project started: – Luke Aug 25 '14 at 06:20
  • Thanks! I copy/pasted your entityFramework/providers section and system.data/DbProviderFactories section data over my local copies that fixed my solution. – Richard R Dec 04 '14 at 00:36
  • "The trick is in the entityFramework/providers section. I had to duplicate the SQLite provider entries for the EF6 provider, but use the old and new invariant names." THANK YOU!!!!!!! – amurka Mar 23 '16 at 20:37
  • Really?? Why is EF still so messed up? It's supposed to make things _easier_. – SteveCinq Dec 13 '17 at 08:41
6

After 6 hours of trial/error attempts, head banging on the wall and other stuff we devs do figuring out how things work, I believe I managed to have it working on VS 2013.

Follow this steps.

  1. Install System.Data.SQLite if you haven't done so already.
  2. Fetch System.Data.SQLite in your project from NuGet (notice it adds some stuff in the app.config).
  3. This is the important part. Save your solution and exit VS 2013.
  4. Reload the solution and now you can add a ADO.NET Entity Data Model into your project.

Each time you want to add a model you will have to exit VS 2013 and must create the model using "New Connection..."

Why it works this way, you say? The universe works in mysterious ways, I say.

Edit: Working further on it I discovered that in order to open a connection to the model you have to change the provider in the config from <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" /> to <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" /> and DbProviderFactories has to be inside a system.data tag in not in already.

Jimi
  • 1,208
  • 1
  • 11
  • 16
  • i still get System.Data.Entity.Core.ProviderIncombatibleException like the comment from PWRR2207 but the EF5 workaround worked, i used the example project from here which has it all set up to create edmx file on the basis of a v5 EF http://geekswithblogs.net/danielggarcia/archive/2013/12/22/portable-databases-ii-using-sqlite-with-entity-framework.aspx – Cel May 09 '14 at 09:26
6

Just want to share with all my experience with the same problem

I tried to use System.Data.SQLite 1.0.94 and EF6 and have some issues with connection to database. I work in VS 2013.4. After installing all necessary packages and cheking web.config as pmbc suggested I still had the same problem with connection and exception of type System.Data.Entity.Core.ProviderIncompatibleException.

After some additional searching in the internet I found this add-on for VS2013 to work with SQL Compact and SQLite Databases which really hepled me: https://visualstudiogallery.msdn.microsoft.com/0e313dfd-be80-4afb-b5e9-6e74d369f7a1

Now I can use exsiting SQLite db/create new one from VS/create EF model using existing db and all other stuff

Hope this helps

UPDATE

Just some more info for help. Here is my resulting .config file section

<entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  <providers>
    <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6, Version=1.0.95.0, Culture=neutral" />
    <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6, Version=1.0.95.0, Culture=neutral" />
  </providers>
</entityFramework>
<system.data>
  <DbProviderFactories>
    <remove invariant="System.Data.SQLite" />
    <remove invariant="System.Data.SQLite.EF6" />
    <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
    <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" />
  </DbProviderFactories>
</system.data>

Also check version number of System.Data.SQLite.dll library which you installed locally (by defaulr, it is installed in GAC) Your GAC version and version of package in your current project must be the same. Otherwise you'll catch an exception when you start your app

Tharif
  • 13,794
  • 9
  • 55
  • 77
Andrew
  • 1,474
  • 4
  • 19
  • 27
  • Unlike the accepted answer, this worked for me, but I had to remove 'Version=1.0.95.0, Culture=neutral"' from the provider definitions. – Eternal21 Apr 17 '18 at 22:09
4

It worked for me on VS 2010 using a console app and doing code first. In any case here is my app.config, which is based on Brice's EF6 SQLite tutorial (http://www.bricelam.net/2012/10/entity-framework-on-sqlite.html):

<?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>
Drexter
  • 55
  • 5
  • Aye, that is sort of what I am doing for any new projects that require SQLite (create a 2012 MVC4 web app in VS2013 and not upgrade EF...) :( – PWRR2207 Feb 15 '14 at 12:51
  • This app.config does not work for me. I have posted a similar question here: http://stackoverflow.com/questions/21769255/how-do-you-make-entity-framework-6-sqlite-code-first-work . This is the project that uses SQLite 1.0.91 and code first but does not work: http://www.sendspace.com/file/ovdxly – Yiannis Mpourkelis Feb 15 '14 at 13:01
  • @YiannisMpourkelis I downloaded your code and found that this line in your app.config should be changed to this – Drexter Feb 15 '14 at 14:13
  • @PWRR2207 I'm a bit confused as to your response. What is it that you are trying to accomplish if you are saying you are trying to not upgrade EF? Unfortunately I do have VS 2013 so I cannot confirm on my end that EF6 and SQLite 1.0.91.0 works. I'll get a copy and let you know my findings. – Drexter Feb 15 '14 at 14:23
  • @Drexter - I have both VS2010 Pro and VS2013 Pro. If I create an MVC Web App version 4 (MVC4) Project in either, I can use Entity Frameworks version 5 (EF5) with SQLite version 1.90/.91. If I upgrade EF to version 6 or try to create anything that uses EF6 (MVC/WPF/Win Console/etc), I cannot use any version of System.Data.SQLite in that Project or Web. – PWRR2207 Feb 15 '14 at 20:32
  • @PWRR2207 Hmmm...that is weird. I build my console app from the ground up and no problem. I haven't been able to reproduce the issue. I'll ping back if I find something useful. – Drexter Feb 16 '14 at 02:26
  • @Drexter Can you upload the working console project to give it a try? – Yiannis Mpourkelis Feb 16 '14 at 22:15
  • @Drexter I tried what you suggest but I am still getting errors. The project is here:http://www.sendspace.com/file/6bn7rm Is it working on your machine? – Yiannis Mpourkelis Feb 17 '14 at 03:00
  • @YiannisMpourkelis - Fixed the code. There was a couple of things I had to change around to make it work. 1) Placed the class files in separate files. Created the animals.sqlite db because the driver does not support create database automatcially. Here is the link to the files:https://github.com/Drexter/EF6_SQLite – Drexter Feb 17 '14 at 17:33
  • @YiannisMpourkelis FYI, I created the database using this firefox extension https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/ Good luck and let me know how things work out. – Drexter Feb 17 '14 at 17:39
  • @PWRR2207 - Do you mind creating a project in 2010 and upload it to like GitHub? I can take a look at it because I can create it just fine. I was able to resolve Yiannis issue but I have to admit I'm still trying to figure out EF's quirks as I have more experience with nHibernate. – Drexter Feb 19 '14 at 23:57
  • @Drexter - :/ VS2010 uses EF5 which works fine with SQLite if I reference the three local dll's instead of using NuGet. Why? Because NuGet now upgrades EF5 to EF6 when installing SQLite. I can do the same thing in VS2013 by choosing MVC4 as the MVC4 template also uses EF5 but when I upgrade EF5 to EF6, the Controllers fail during runtime, despite all my variations on the SQLite Provider in web.config... – PWRR2207 Feb 20 '14 at 04:46
  • You may have to open a ticket with the people over at System.Data.SQLite. Looks like there may be issues with how it's set up. Didn't realize that he removed previous versions. Check this tweet https://twitter.com/demisbellot/status/435040161030619136 – Drexter Feb 20 '14 at 16:03
  • @Drexter - *sigh* Well, I am glad I made copies last week of all the .91 DLL's from the debug of one of my test projects in case I actually have to create any MVC projects that require SQLite :| – PWRR2207 Feb 20 '14 at 17:11
3

Finally This Solution Work for me. DotNet Framewok=4.5.1 Entity framework=6.1.1

Download this :sqlite-netFx451-setup-bundle-x86-2013-1.0.94.0.exe

<?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" />
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
  </startup>

  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <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" />
    </providers>
  </entityFramework>

  <system.data>
    <!--
        NOTE: The extra "remove" element below is to prevent the design-time
              support components within EF6 from selecting the legacy ADO.NET
              provider for SQLite (i.e. the one without any EF6 support).  It
              appears to only consider the first ADO.NET provider in the list
              within the resulting "app.config" or "web.config" file.
    -->
    <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.94.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />

      <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" />
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <add name="VelocityDBEntities" connectionString="metadata=res://*/AppData.Model1.csdl|res://*/AppData.Model1.ssdl|res://*/AppData.Model1.msl;provider=System.Data.SQLite.EF6;provider connection string=&quot;data source=F:\VelocityPOS\VelocityDB.sqlite&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>
Umar Abbas
  • 4,041
  • 2
  • 23
  • 21
3

I just set Copy local = True for System.Data.SQLite.EF6 library (in References -> System.Data.SQLite.EF6 -> Property) and it works

2

After hours spent on digging through internet, here I present a working solution

<?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>
  <entityFramework>
    <providers>
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
    </providers>
  </entityFramework>
  <connectionStrings>
    <add name="NorthwindContext" connectionString="Data Source=Northwind.sl3" providerName="System.Data.SQLite.EF6" />
  </connectionStrings>
  <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" />
    </DbProviderFactories>
  </system.data>
</configuration>

project

user1075940
  • 1,086
  • 2
  • 22
  • 46
2

That works for me :

<entityFramework>
    <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" />
    </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" />
        <!--<add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
        <remove invariant="System.Data.SQLite" />
        <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" />-->
    </DbProviderFactories>
</system.data>

With the latest nuget package (1.0.94.1) : https://www.nuget.org/packages/System.Data.SQLite/ And SQLite tools : Setups for 32-bit Windows (.NET Framework 4.5.1) at http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

akhansari
  • 954
  • 9
  • 13
2

I experienced the same kind of error, but for a reason which seems to not have been covered by the other answers. So I would like to share my own case.

In the assembly which contains EDMX, everything was ok. In client (executing) assembly, I had always the same error at runtime (The Entity Framework provider type 'System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6' registered in the application config file for the ADO.NET provider with invariant name 'System.Data.SQLite.EF6' could not be loaded.)

I noticed that for EDMX assembly the "Copy local" was set to true, but not in executing assembly. I fixed it, and it was ok. So if you experience this issue too and you don't have SQLite provider in GAC, check in your references if you have enabled "copy local" for the SQLite DLLs

I lost a long time before to figure at checking provider and a bunch of other things, so I hope it will be helpful for some others !

AFract
  • 8,868
  • 6
  • 48
  • 70
  • Thanks! I got in the habit of turning off Copy Local from coding for AutoCAD and will keep this in mind for other projects. – PWRR2207 Mar 15 '15 at 04:03
1
<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>

this worked for me there are some internal errors while it runs probably do the differences between how EF likes to have 2 other tables for code first __MigrationHistory & EdmMetadata. I would call it trivial for now but if you truly want to take advantage of CodeFirst those tables have to be created manually I am assuming for now.

Edit -- Only entry in provider list and I removed all references to SqlServer...

Vs2013 Ultimate lastest SQLite Nuget.

mvermef
  • 3,814
  • 1
  • 23
  • 36
1

I had a permission issue during the package installation, so I got this error. i solved running vs2013 as administrator.

so:

  1. unistall the package
  2. close vs2013
  3. run it again as administrator (important)
  4. install the nugetpackage again

in the end i also ad this in the providers (as suggested by the other users):

  <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
Paolo Sanchi
  • 783
  • 9
  • 19
  • Unfortunately I know it is not an Admin Rights issue as I have been using a custom "Run as Administrator" VS2013 shortcut for the past few months to reduce the whining from Windows 8 as I work on Web API feeds and I have lost track of how many times I have installed NuGet SQLite (and EF6) :( – PWRR2207 Mar 25 '14 at 00:16
1

Here is the solution that worked for me.

Install the System.Data.SQLite package and make sure that the db factories section is like below.

<DbProviderFactories>
  <remove invariant="System.Data.SQLite" />
  <remove invariant="System.Data.SQLite.EF6" />
  <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
  <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" />
</DbProviderFactories>
mrstebo
  • 911
  • 9
  • 12
1

By installing the latest SQLite from Nuget Package manager, I had got an error when installing SQLite packages (while working on a project that needed edmx over sqlite DB).

Step 1: Read the message carefully. It can reveal what the error message is trying to convey.

Eg:

An error occurred while connecting to the database. The database might be unavailable. An exception of type 'System.InvalidCastException' occurred. 

The error message is: '[A]System.Data.SQLite.SQLiteConnection cannot be cast to [B]System.Data.SQLite.SQLiteConnection. 

Type A originates from 'System.Data.SQLite, Version=1.0.105.1, Culture=neutral, PublicKeyToken=db937bc2d44ff139' in the context 'Default' 
at location 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\System.Data.SQLite\v4.0_1.0.105.1__db937bc2d44ff139\System.Data.SQLite.dll'. 

Type B originates from 'System.Data.SQLite, Version=1.0.106.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139' in the context 'LoadNeither' 
at location 'C:\Users\Ganesh Kamath\AppData\Local\Microsoft\VisualStudio\14.0\ProjectAssemblies\og1mcjvn01\System.Data.SQLite.dll'.'.

After reading this I realized that I had chosen Version 1.0.106.0 for upgrade.

Essentially the message says that it knows version 1.0.105.1 but not version 1.0.106.0.

Step 2: Remove the version causing the problem by manually selecting the occurence in Nuget Package for Solution option in Visual Studio.

Tools > Nuget Package Manager > Manage Nuget Packages for Solution...

enter image description here

Step 3: Use Nuget Command line to install the version of SQLite that the system understands.

In the example above, the version is 1.0.105.1

Tools > Nuget Package Manager > Package Manager Console

enter image description here

The commands needed for this will look like the following:

Install-Package System.Data.SQLite -Version 1.0.105.1 
Install-Package System.Data.SQLite.Core -Version 1.0.105.1 
Install-Package System.Data.SQLite.EF6 -Version 1.0.105.1