使用不变名称为'System.Data.SQLite.EF6'的ADO.Net提供程序未在计算机或应用程序配置文件中注册。

5

我已经努力了一个星期来解决这个问题。当我尝试在除了我的开发机器以外的另一台计算机上运行我的应用程序时,会出现以下错误:

指定的架构无效。错误: EntityFramework.RemManagerDBModel.ssdl(2,79): error 0175: 具有不变名称'System.Data.SQLite.EF6' 的 ADO.Net 提供程序未在计算机或应用程序配置文件中注册,或者无法加载。请查看内部异常以获取详细信息。

我尝试使用此方法检索内部异常,但没有成功。我不确定为什么它似乎认为存在内部异常,实际上却不存在?

关于尝试自行修复问题,我已经尝试过所有相关的可能解决方案(我相信)都可以在SO问题下找到。

目前,我的 app.config 大致如下所示。还包括创建的连接字符串示例。该应用程序使用 Entity Framework 6 进行数据优先配置。实体模型和图表是从数据库文件新生成的。我能够毫无问题地打开实体图表,通过“运行自定义工具”选项重新生成它也没有任何区别。问题只在我尝试在另一台计算机上运行已安装的应用程序时出现。在这种情况下,该计算机是全新(出厂恢复)的 Windows 10。

如果需要更多信息,我可以根据需要添加。

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" />
    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="RemManager.Forms.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
    </sectionGroup>
  </configSections>
  <connectionStrings>
    <!-- See Datasource.ConnectionController for the connection string builder.-->
  </connectionStrings>
  <entityFramework>
    <providers>
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6, Version=1.0.106.0, Culture=neutral" />
      <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6, Version=1.0.106.0, Culture=neutral" />
    </providers>
  </entityFramework>
  <system.web>
    <membership defaultProvider="ClientAuthenticationMembershipProvider">
      <providers>
        <add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
      </providers>
    </membership>
    <roleManager defaultProvider="ClientRoleProvider" enabled="true">
      <providers>
        <add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
      </providers>
    </roleManager>
  </system.web>
  <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" />
      <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>

示例连接字符串:

metadata=res://*/EntityFramework.RemManagerDBModel.csdl|res://*/EntityFramework.RemManagerDBModel.ssdl|res://*/EntityFramework.RemManagerDBModel.msl;provider=System.Data.SQLite.EF6;provider connection string="data source=C:\Users\MacbookPro\AppData\Roaming\RemManager\Datasource\RemManagerDB.db;default timeout=5000;failifmissing=True;read only=False;version=3"

System.Data.SQLite在另一台机器上不在GAC中。在您的项目中找到该引用并将CopyLocal设置为true,看看是否有效。 - Daniel Lorenz
@DanielLorenz 很不幸,这两个引用已经是CopyLocal=True了。我猜我只需要在主项目中的引用上做这个操作?在安装程序项目中没有必要进行任何更改吗?对于这个应用程序来说,在安装目录中也有所有相关的SQLite和SQLite.EF6 DLL文件。 - Eunoseer
也许这个可以帮助:https://github.com/ErikEJ/SqlCeToolbox/wiki/EF6-workflow-with-SQLite-DDEX-provider? - ErikEJ
1
@DanielLorenz 这篇文章看起来很有前途。我已经尝试了,但仍然没有运气。我可能会尝试创建一个单独的项目,并尝试重新构建数据层,看看是否能发现任何问题。如果这行不通,我可能会将测试代码公开并在此处链接,以便人们可以自己进行实验。 - Eunoseer
好久不见,但这个问题仍未解决。我已经更新了最新版本的sqlite和entity framework,但似乎没有什么改变。我从来没有进行过那个测试项目,但我有另一个即将到来的项目将使用类似的功能,如果它面临同样的问题,我会再次报告。 - Eunoseer
@Eunoseer,请查看此解决方案 https://dev59.com/u2kw5IYBdhLWcg3wrsdS - Ihab
1个回答

1
我在这里找到了解决方法:SQL DDEX for EF6,因为我把VS安装到了一台新的笔记本电脑上。
步骤:
  • 安装最新的SQLCEToolbox(这是一个.vsix插件,可以在VS IDE中打开SQLite数据库)。按照安装程序的提示进行操作,可能需要停止一些任务,您需要点击“结束任务”以继续安装。

  • 在GAC中安装SQLite(注意:x86而不是x64)。 每台机器只需安装一次。从https://system.data.sqlite.org/index.html/doc/trunk/www/downloads-unsup.wiki下载最新的sqlite-netFx46-setup-bundle-x86-2015-1.0.xxx.0.exe。

    注意:对于VS2022,请使用x64设置包。

  • 选择所有复选框:“完整安装”,将程序集安装到全局程序集缓存中,并安装VS设计器组件。

  • 重新启动VS。

检查方法: 在VS主菜单中,点击“工具”,会出现一个新的选项SQLite/SQLServer compact toolbox。点击它,会打开一个新的标签页,其中附近有解决方案资源管理器。点击“关于”(问号图标),检查GAC和DDEX提供程序是否都为“是”。

我稍后会尝试一下。我必须启动其他所有内容,因为我已经搁置了这个项目。如果我没有安装VS,这个工具还能用吗?我的想法是,在使用发布版本的工具时,不需要在计算机上安装VS。 - Eunoseer
好吧,我猜你只需要选择第二个选项并跳过第一步,因为第一步是针对VS的,而第二步是针对Windows机器GAC的。但请注意,在“安装VS设计器组件”中取消选中GAC安装程序,因为你不需要它。我想我错过了你说你要部署到另一台非开发机器的那部分,所以是的,请跳过第一步。我是在另一台我使用的开发机器上安装的。 - k3nn

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