SQLite Entity Framework ADO.net提供程序错误1.0.92.0

3
我正在尝试理解SQlite和实体框架之间的交互方式。 我在Visual Studio 2013中创建了一个新的控制台项目。我安装了SQlite 1.0.92的NuGet包。 我创建了一个新的空模型(edmx),并尝试从静态示例数据库(如northwind.db)填充它。 之后,我遇到了这个错误:错误0175:计算机上未注册名为“System.Data.SQLite.EF6”的ADO.NET提供程序。 有什么想法吗? 谢谢 Lorenzo

你正在使用哪个版本的Visual Studio?你的配置文件是什么样子的? - Pawel
VS2013。配置文件是使用NuGet安装组件后创建的文件。 - LoxLox
我收到了“无法找到与此版本兼容的Entity Framework数据库提供程序,用于您的数据连接”,有什么想法吗?有关完整描述,请参见http://social.msdn.microsoft.com/Forums/en-US/6a73f58f-4e71-453a-abf2-37e49e7db535/sqlite-vs2012-ef6-code-first?forum=Offtopic - Cel
2个回答

4

经过一些测试,我找到了一个可能的解决方案。让我们从头开始:

从 SQLite 服务器下载 SQLite ado.net 提供程序(x86 版本)。您必须使用 gacutil 手动在 GAC 中注册这三个库:system.data.sqlite、system.data.sqlite.ef6 和 system.data.sqlite.designer。

启动 Visual Studio 2013。添加对 NuGet SQLite 1.0.92.0 的引用(这也将添加对 Entity Framework 6.1 的引用)。

您的 app.config 将如下所示:

<?xml version="1.0" encoding="utf-8"?>
<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>
  <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>
  <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>
<connectionStrings>

在服务器资源管理器中添加新的Sqlite连接并测试它。 现在在您的项目中添加并创建一个新的空ado.net实体模型。
这应该可以工作...但是当您运行应用程序并从其中一个dbset中获取一些记录时,您将会收到一个异常,告诉您没有为您的连接注册ado.net提供程序(system.data.sqlite)。
转到您的配置文件,并在提供程序部分添加以下内容(只需复制以前的sqlite行并剪切不变名称中的.ef6后缀):
<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />

保存所有更改并重新构建应用程序。现在它可以工作,但如果您返回到模型详细信息并尝试从数据库刷新模型,则会再次出现提供程序异常。注释掉最后添加的提供程序并重试。它可以工作!!!
我认为这是由于syste.data.sqlite和system.data.sqlite.ef6中提供程序名称之间的冲突所致。
尽管如此,我无法进行模型优先(首先创建一个模型,然后从中创建新的数据库),因为我会遇到另一个ado.net提供程序异常。
有什么想法吗?
谢谢 Lorenzo
_________________ 更新04-2014 _________________
经过一些测试和搜索... 我读到,当你想使用VS设计工具时,你必须安装正确的x86版本的SQLite驱动程序。这些驱动程序为了与VS工具正常工作,需要在安装过程中将其System.Data.SQLite版本注册到GAC中(只有在此之后,VS才知道在哪里找到设计工具的连接提供程序)。当您使用模型优先方法并要求模型创建db而不是使用在app.config中注册的正确驱动程序时,它会尝试使用在GAC中注册并由visualmodel创建工具使用的实体连接打开(不兼容的)连接提供程序。我认为目前没有办法使用VS的实体建模工具与SQLite提供程序。
Lorenzo

1
您不再需要手动在GAC中注册SQLite ADO.Net提供程序。现在有一个原生支持VS2013的版本。请访问http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki并搜索“Visual Studio 2013”。截至今天,安装程序被称为sqlite-netFx451-setup-bundle-x86-2013-1.0.92.0.exe。 - Lee Richardson
这个修复方法对我来说有效,我是在vs2010上通过nuget安装了sqlite 1.0.92.0。谢谢。 - flobadob
很遗憾,即使使用版本为1.0.92.0的Model First,在使用来自SQLite.org的VS2013 x86安装程序时,也无法与Visual Studio 2013和EF6一起使用。 :( - Rodney S. Foley
我不明白,安装/卸载1.0.94.0 x86 4.5.1适用于VS2013多次,但对我没有任何作用。无法创建新的SQLite数据连接。 - Sebastien GISSINGER

0

@LoxLox:我认为你不必在GAC中注册dll。我遇到了与你相同的问题,但我只需要像在post中讨论的那样通过向不变量添加.EF6后缀来编辑.config文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接