简体   繁体   English

System.Data.SQLite 1.0.91.0和EF6.0.2

[英]System.Data.SQLite 1.0.91.0 and EF6.0.2

Has anyone gotten the new System.Data.SQLite 1.0.91.0 to work with Entity Framework 6 in Visual Studio 201#? 有没有人在Visual Studio 201#中使用新的System.Data.SQLite 1.0.91.0与Entity Framework 6一起工作? 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): 更新 - 2014年3月20日:System.Data.SQLite 1.0.92.0已经发布但我没有在VS2013中创建EDMX的运气:(我最终使用包管理器(因为EF6。#。#是新SQLite中的依赖项) NuGet包):

uninstall-package entityframework -force

restart VS2013 and put the older EF5 on to get VS2013 to generate an EDMX from an existing database: 重新启动VS2013并打开旧版EF5以获取VS2013以从现有数据库生成EDMX:

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 :/ 注意:这不是一个复杂的多表SQLite关系数据库测试,所以如果我使用多个导航(FK)关系的任何东西,我不确定会出现什么其他问题:/

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. 回答EDMX /模型的答案:(更新 - 2014年3月2日)我找到了解决办法,但它不够一致,需要太多步骤才能将其视为有效的解决方案。 Basically: 基本上:

  • you make all the Class(es) file(s), 你制作所有的Class(es)文件,

  • make a connection to an existing SQLite database with tables, 使用表建立与现有SQLite数据库的连接,

  • 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 修改web / app.config,如仍然出色的SQLite故障单( http://system.data.sqlite.org/index.html/tktview?name=7b8fd3ef77 )中的mistachkin所述,包括伪造cdsl / .ssdl /.msl件,和

  • then manually create all the Entity Models in the Designer in an Empty EDMX before rebuilding the project and then... 然后在重建项目之前在Empty EDMX中手动创建Designer中的所有实体模型,然后......

  • your right click on an Entity and choose 'Update from database'... 右键单击实体并选择“从数据库更新”...

Sometimes EF/VS2013 will add the .tt/DbContesxt and sometimes they don't. 有时EF / VS2013会添加.tt / DbContesxt,有时则不会。 Way too 'hit or miss' :( 方式也'命中或错过':(

ANSWER for "Code First" with and without an existing SQLite database (based on PMCB, Drexter, and Jimi's suggestions). 有和没有现有SQLite数据库的“Code First”的答案(基于PMCB,Drexter和Jimi的建议)。 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... 但请注意,您无法在Visual Studio 2013中自动生成任何EF模型或EDMX文件[原文如此 - 概念架构定义语言(.CSDL),存储架构定义语言(.SSDL)和映射规范语言(.MSL)]。我做了不要尝试手动创建EDMX文件以查看它们是否适合EF,即使我这样做,在我看来,做所有手动创建/映射/更改/ XML编辑都会破坏基于实体的框架的整个目的/概念...

<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...): 这是测试类(请注意,我必须将DogID更改为Int64以使其与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: 这是测试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". 昨天发布了SQLite 1.0.91.0( http://system.data.sqlite.org/index.html/doc/trunk/www/news.wiki ),其中包含“添加对实体框架6的支持”。 There is a caveat in the included 'Readme' that has you add the following to the following to web.config/app.config: 包含的“自述文件”中有一个警告,您可以在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: 如果在VS2013中使用NuGet添加“System.Data.SQLite(x86 / x64)”,现在将此行添加到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. 作为测试,我制作了一个工作的NET4.5.1 / MVC4 / EF5 / System.Data.SQlite 1.0.90应用程序的副本,并在其上运行PM:update-package。 It successfully added the above line to my web.config and I added the required "DbProviderFactories" pieces. 它成功地将上面的行添加到我的web.config中,并添加了所需的“DbProviderFactories”部分。 Rebuild and run... Fail with 'no provider found'. 重建并运行......未找到'找不到提供商'。 I try it without the "DbProviderFactories"... Fail with 'no provider found'. 我在没有“DbProviderFactories”的情况下尝试它...在'找不到提供者'时失败。 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. 所以我尝试了一个新的项目,但有或没有Identity(OWIN),以防出现问题。 Neither work... Pretty much run out of ideas, so asking here after Google/StackOverflow searches. 两者都没有工作......几乎没有想法,所以在Google / StackOverflow搜索之后问这里。

============ 14 Feb 2014 =============== ============ 2014年2月14日===============

Unfortunately the changed entries and numerous variations did not work on my PC... I am using VS 2013 Pro on Win8.1 Pro x64. 不幸的是,更改的条目和众多变化在我的PC上无效...我在Win8.1 Pro x64上使用VS 2013 Pro。 I reinstalled System.Data.SQLite. 我重新安装了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): 至少我收到了现有SQLite数据库和VS2013创建的新数据库的新错误(我可以访问它并看到它具有零表的正确结构):

"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. EF6和System.Data.SQLite(x86 / x64)都通过NuGet引入全新的MVC Web应用程序和Windows控制台应用程序。 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... 两者都产生了上述错误......我开始怀疑我的VS3013可能出现了问题,但是当我可以使用MVC4 / SQLite / EF5时,我不想再花6个小时下载和修补它...

===== 17 Feb 2014 ======== ===== 2014年2月17日========

@Jimi - No luck here. @Jimi - 这里没有运气。 I tried with NET 4.5 and 4.5.1 with a new MVC and Windows Application Project. 我尝试使用新的MVC和Windows应用程序项目使用.NET 4.5和4.5.1。 I tried with EF6.0.0 and EF6.0.2. 我尝试使用EF6.0.0和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 . 我尝试从NuGet添加“System.Data.SQLite(x86 / x64)”后,从安装System.Data.SQLite替换3x SQLite.Data.xxx.dll引用本地副本。 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. 我还尝试了NuGet“System.Data.SQLite.MSIL”包,而不是将DBFactories添加到我尝试的各种版本的Web.Config和App.Config中。

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. 我也尝试创建一个.NET 4.0 MVC4 Web应用程序,但看起来NuGet的“System.Data.SQLite(x86 / x64)”现在包含了对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. 充满希望,我一起去尝试各种'保存/创建新连接/编辑web.config / etc',但它不起作用。 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). 我已经放弃了,现在又回到了使用数据集的SQLite,因此我可以将Linq与System.Data.DataSetExtensions一起使用,使DataTables为“AsEnumerable”(或Java(jdbc),供那些希望在Android上使用数据库的脱机副本的人具有最小App界面的OS设备)。

========= 19 Feb 2014 ======= ========= 2014年2月19日=======

@Christian Sauer - I did not get EF6 and System.Data.SQLite (or System.Data.SQLite.EF6) to work together, yet... but @Christian Sauer - 我没有让EF6和System.Data.SQLite(或System.Data.SQLite.EF6)一起工作,但......

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: 我刚刚在http://system.data.sqlite.org/index.html/tktview?name=7b8fd3ef77上发现了一个更新,它说有一个更新的SQLite NuGet包:

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)... 我现在正在使用一个新项目(使用EF6.0.2的VS2013中的MVC Web项目和面向.NET 4.5.1的SQLite 1.0.91.3)测试它...

No luck again with the new SQLite 1.0.91.3. 新的SQLite 1.0.91.3再没有运气。 The web.config has changed to: web.config已更改为:

  <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. 上班后我会尝试搞乱配置(如Jimi和PCMB所建议的那样)并发布任何调查结果。

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. 我只是尝试重新安装32和64位版本的System.Data.SQLite(添加和不添加到GAC),但EF6不能与SQLite一起使用。 If I try to manually build the model and mappings, it fails any time I reference/try to use EF6. 如果我尝试手动构建模型和映射,它会在我引用/尝试使用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. 至于创建实体数据模型(无论是从现有的SQLite还是新的SQLite数据库生成),无论我对配置,连接还是提供者做什么,它都会失败/错误。

=========== 22 Feb 2014 ============= =========== 2014年2月22日=============

They pulled/rolled-back the System.Data.SQLite 1.0.91.3 update to 1.0.91.0. 他们将System.Data.SQLite 1.0.91.3更新/回滚/回滚到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. 还有一张优秀的票证( http://system.data.sqlite.org/index.html/tktview?name=7b8fd3ef77 ),其中包含一些错误的建议。 Here is the app.config mistachkin recommended trying (this config did not work for me either before or...): 这是app.config mistachkin推荐尝试(这个配置在我或之前不适用于我):

<?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")... 在我尝试使用mistachkin的建议将dll添加到GAC(使用.NET“gacutil.exe”完成)之后......

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. NuGet包将相应的条目“System.Data.SQLite.EF6”添加到EntityFramework提供程序工厂中,但您必须删除或注释掉旧的“System.Data.SQLite”条目。 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. 如果任何提供程序条目无效,EF上下文构建器将会崩溃,并且EF6中不支持旧的1.0.91 SQLite提供程序。

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. 编辑:清理配置允许我的其他上下文对象(SQL Server)实例化,但它仍然不会正确实例化SQLite上下文对象。 The inner exception is 内在的例外是

Unable to find the requested .Net Framework Data Provider. 无法找到请求的.Net Framework数据提供程序。 It may not be installed. 它可能没有安装。

EDIT 2/SOLUTION Finally figured it out! EDIT 2 / SOLUTION终于明白了! 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. 我认为System.Data.SQLite中存在一个问题,即强制引用System.Data.SQLite提供程序名称而不是连接字符串中提供的值。 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提供程序部分创建两个条目来解决这个问题,一个名为“System.Data.SQlite”,另一个名为“System.Data.SQLite.EF6”,但两个提供程序实际上都使用EF6提供程序。

<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>

Here is my whole config file. 这是我的整个配置文件。 I am running EF 6.0.2 with SQLite 1.0.91. 我正在使用SQLite 1.0.91运行EF 6.0.2。 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. 我还没有尝试过模型生成器,但我的上下文对象工作正常,我通过上下文测试了insert / update / delete以及通过dbcontext直接测试SQL命令。 The trick is in the entityFramework/providers section. 诀窍在entityFramework / providers部分。 I had to duplicate the SQLite provider entries for the EF6 provider, but use the old and new invariant names. 我不得不复制EF6提供程序的SQLite提供程序条目,但使用旧的和新的不变名称。

    <?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>

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. 经过6个小时的试验/错误尝试后,我们开发人员确定了如何工作,我认为我已经设法在VS 2013上工作了。

Follow this steps. 按照以下步骤操作

  1. Install System.Data.SQLite if you haven't done so already. 如果您还没有安装System.Data.SQLite ,请安装它。
  2. Fetch System.Data.SQLite in your project from NuGet (notice it adds some stuff in the app.config). 从NuGet中获取项目中的System.Data.SQLite(注意它在app.config中添加了一些东西)。
  3. This is the important part. 这是重要的部分。 Save your solution and exit VS 2013. 保存解决方案并退出 VS 2013。
  4. Reload the solution and now you can add a ADO.NET Entity Data Model into your project. 重新加载解决方案,现在您可以将ADO.NET实体数据模型添加到项目中。

Each time you want to add a model you will have to exit VS 2013 and must create the model using "New Connection..." 每次要添加模型时,都必须退出VS 2013,并且必须使用“新建连接...”创建模型。

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. 编辑:进一步研究它我发现,为了打开与模型的连接,您必须从<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />更改配置中的<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" /><provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />DbProviderFactories必须位于system.data标记内。

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. 我尝试使用System.Data.SQLite 1.0.94和EF6,并且在连接数据库方面存在一些问题。 I work in VS 2013.4. 我在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 . 在安装了所有必需的软件包并将web.config作为pmbc建议后,我仍然遇到与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 在互联网上进行了一些额外的搜索后,我发现VS2013的这个附加组件可以与SQL Compact和SQLite数据库一起使用,这真的让我感到困惑: 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 UPDATE

Just some more info for help. 只需要一些帮助信息。 Here is my resulting .config file section 这是我生成的.config文件部分

<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. 还要检查本地安装的System.Data.SQLite.dll库的版本号(默认情况下,它安装在GAC中)您当前项目中的GAC版本和软件包版本必须相同。 Otherwise you'll catch an exception when you start your app 否则,您在启动应用程序时会遇到异常

It worked for me on VS 2010 using a console app and doing code first. 它在VS 2010上使用控制台应用程序并首先执行代码。 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 ): 无论如何这里是我的app.config,它基于Brice的EF6 SQLite教程( 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>

Finally This Solution Work for me. 最后这个解决方案适合我。 DotNet Framewok=4.5.1 Entity framework=6.1.1 DotNet Framewok = 4.5.1实体框架= 6.1.1

Download this : sqlite-netFx451-setup-bundle-x86-2013-1.0.94.0.exe 下载: 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>

我只是为System.Data.SQLite.EF6库设置了Copy local = True(在References - > System.Data.SQLite.EF6 - > Property中)它的工作原理

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 项目

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 使用最新的nuget包(1.0.94.1): https ://www.nuget.org/packages/System.Data.SQLite/和SQLite工具:32位Windows(.NET Framework 4.5.1)的设置,位于http: //system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

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. 在包含EDMX的程序集中,一切正常。 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.) 在客户端(执行)程序集中,我在运行时始终存在相同的错误(实体框架提供程序类型'System.Data.SQLite.EF6.SQLiteProviderServices,System.Data.SQLite.EF6'在ADO的应用程序配置文件中注册。无法加载具有不变名称'System.Data.SQLite.EF6'的.NET提供程序。)

I noticed that for EDMX assembly the "Copy local" was set to true, but not in executing assembly. 我注意到,对于EDMX程序集,“Copy local”设置为true,但不执行程序集。 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 因此,如果您遇到此问题并且您在GAC中没有SQLite提供程序,请检查您的引用是否已为SQLite DLL启用了“copy local”

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 ! 我失去了很长一段时间来检查提供商和其他一些东西,所以我希望它对其他人有用!

<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. 这对我来说有一些内部错误,但它运行时可能会在EF喜欢为代码首先使用其他2个表__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. 我现在称它为微不足道但是如果你真的想要利用CodeFirst那些表必须手动创建我现在假设。

Edit -- Only entry in provider list and I removed all references to SqlServer... 编辑 - 仅提供者列表中的条目,我删除了对SqlServer的所有引用...

Vs2013 Ultimate lastest SQLite Nuget. Vs2013 Ultimate lastest SQLite Nuget。

I had a permission issue during the package installation, so I got this error. 我在包安装过程中遇到了权限问题,所以我收到了这个错误。 i solved running vs2013 as administrator. 我解决了以管理员身份运行vs2013的问题

so: 所以:

  1. unistall the package 取消包装
  2. close vs2013 关闭vs2013
  3. run it again as administrator (important) 以管理员身份再次运行(重要)
  4. install the nugetpackage again 再次安装nugetpackage

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" />

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. 安装System.Data.SQLite包并确保db factories部分如下所示。

<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>

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). 通过从Nuget包管理器安装最新的SQLite,我在安装SQLite包时遇到了错误(在处理需要edmx而不是sqlite DB的项目时)。

Step 1: Read the message carefully. 第1步:仔细阅读信息。 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. 阅读本文后,我意识到我已选择版本1.0.106.0进行升级。

Essentially the message says that it knows version 1.0.105.1 but not version 1.0.106.0 . 本质上,该消息表明它知道版本1.0.105.1但不知道版本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. 步骤2:通过在Visual Studio中手动选择Nuget Package for Solution选项中的出现来删除导致问题的版本。

Tools > Nuget Package Manager > Manage Nuget Packages for Solution... 工具> Nuget包管理器>管理解决方案的Nuget包...

在此输入图像描述

Step 3: Use Nuget Command line to install the version of SQLite that the system understands. 步骤3:使用Nuget命令行安装系统理解的SQLite版本。

In the example above, the version is 1.0.105.1 在上面的示例中,版本是1.0.105.1

Tools > Nuget Package Manager > Package Manager Console 工具> Nuget包管理器>包管理器控制台

在此输入图像描述

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM