我试图理解SQlite和实体框架如何相互作用。 我在visual studio 2013中创建了一个全新的控制台项目。我安装了SQlite 1.0.92的nuget数据包。 我创建了一个新的空模型(edmx)并尝试从静态示例数据库(例如northwind.db)填充它。 在此之后我收到此错误:错误0175:ado.net提供程序名为" System.Data.SQLite.EF6"没有在电脑上注册。
有什么想法吗?
谢谢 洛伦佐
答案 0 :(得分:4)
经过一些测试,我发现了一个可能的解决方案。让我们从头开始:
从sqlite服务器(x86版本)下载SQLite ado.net提供程序。 您必须在GAC中手动注册这三个库:system.data.sqlite,system.data.sqlite.ef6,system.data.sqlite.designer with gacutil
启动visual studio 2013.添加对nuget sqlite 1.0.92.0的引用(这也将添加对实体框架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" />
全部保存并重建应用程序。现在它可以工作但是如果你回到模型细节并尝试从db刷新模型,你将再次获得提供者异常。评论添加的最后一个提供商并重试。它工作!!!
我认为这是由于syste.data.sqlite和system.data.sqlite.ef6中提供者名称之间的冲突
尽管如此,我不能先做模型(投影模型,然后从中创建一个新的数据库),因为我得到了另一个ado.net提供者异常。
有关于此的任何想法吗?
谢谢 洛伦佐
_________________ 更新04-2014 _________________
经过一些测试和谷歌搜索...... 我读到当你想使用VS设计工具时,你必须安装正确的x86版本的SQLite驱动程序。这些驱动程序与VS工具一起正常工作,需要在安装过程中在GAC中注册其System.Data.SQLite版本(仅在此VS知道在何处找到设计工具的连接提供程序之后)。 当您使用模型优先方法并且要求模型创建数据库而不是使用在app.config中注册的正确驱动程序时,它会尝试使用在GAC中注册并由可视模型创建工具使用的实体连接打开实体连接(并且不兼容)。我认为目前无法将VS的实体建模工具与SQLite提供程序一起使用。
洛伦佐
答案 1 :(得分:0)
@LoxLox:我认为您不必向GAC注册dll。我有与你相同的问题,但我只需要编辑。post中讨论的.config文件,将.EF6后缀添加到不变量。