错误:找不到具有不变名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序

Posted

技术标签:

【中文标题】错误:找不到具有不变名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序【英文标题】:Error: No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SqlClient' 【发布时间】:2014-03-05 16:08:46 【问题描述】:

我最近将旧项目中的实体框架从版本 4 或 5 升级/更新到版本 6。现在我得到了这个异常:

“System.InvalidOperationException”类型的异常发生在 EntityFramework.dll 但未在用户代码中处理

附加信息:未找到适用于 具有不变名称“System.Data.SqlClient”的 ADO.NET 提供程序。制作 确保提供者在 'entityFramework' 部分中注册 应用程序配置文件。看 http://go.microsoft.com/fwlink/?LinkId=260882 了解更多信息。

我用谷歌搜索了这个错误并遇到了几个 SO 线程,但没有一个包含适合我的解决方案。这就是我的 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>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>

我已经从我的项目中卸载了 Entity Framework 并重新安装了它,删除了对旧 EF 文件的所有引用并重新安装,但对我没有任何作用。我不断收到此错误。

【问题讨论】:

那么您是否考虑过降级或您正在尝试使该版本正常工作 EF6 有一些对我的项目非常有用的功能。 你有什么版本的 Visual Studio,因为我知道 2010 年使用较新的 EF 有问题,我自己有一个问题,请参阅 here Visual Studio 2013 高级版。 No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SqlClient'的可能重复 【参考方案1】:

在我有一个模型项目同时引用 EntityFramework 和 .SqlServer 程序集,以及一个使用 ASP.NET MVC 的单独 UI 项目的情况下,我遇到了这个问题。我想从 EF 4.1 升级到 6.1。 我实际上必须完成这里描述的部分:http://robsneuron.blogspot.com/2013/11/entity-framework-upgrade-to-6.html。我想强调的是,我没有将这些项目的引用添加到我的 UI 项目中,也没有将配置添加到 UI 项目的 web.config,因为这些步骤会违反我的关注点分离。

我所做的是在我的模型项目中,我不得不将 EntityFramework.SqlServer(以及 EntityFramework 引用,为了安全起见)的“复制本地”引用设置翻转为“False”并保存所有内容,以获取项目将&lt;Private&gt; 节点放入.csproj 文件中,然后将其设置回“True”并再次保存,以使True 最终成为最终值。

我还必须在其构造函数中将 hack 行添加到我的DbContext 派生类,以强制使用程序集,即使该行什么也不做。 这两个步骤都是我从博文中学到的。

public MyContext : DbContext

    public MyContext() : base("name=MyContext")
    
        // the terrible hack
        var ensureDLLIsCopied = 
                System.Data.Entity.SqlServer.SqlProviderServices.Instance;   
    

我要感谢我引用的那个博客的作者,以及所有提出和回答关于 SO 问题的人,以帮助我们克服这个可怕的错误。

【讨论】:

如果可以的话,我会支持你两次。将实体框架引用和配置部分保留在 UI 项目之外正是我所希望的;谢谢! 2017 年 10 月。我们已经登陆火星,发明了伟哥,并且能够用我们的手机捕捉口袋妖怪。我们的科学家,其中最聪明的,仍然无法解决自动复制 DLL 的问题。谢谢@bcr,您的帮助:) 2019 年 1 月,这仍然是一个很好的修复。感谢您发布此内容。 谢谢你。我意识到我迟到了,但这解决了我的问题。【参考方案2】:

好吧,这很奇怪。我有几个项目:一个是 UI 项目(一个 ASP.NET MVC 项目),另一个是用于存储库之类的项目。存储库项目引用了 EF,但 UI 项目没有(因为它不需要一个,它只需要引用其他项目)。在我也为 UI 项目安装了 EF 之后,一切都开始工作了。这就是为什么它将这段代码添加到我的 Web.config 中:

<entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  <providers>
    <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
  </providers>
</entityFramework>

【讨论】:

这并不奇怪,你的 dll 的 app.configs 没有被烘焙到 dll 中,如果你需要配置,你需要将它添加到主 app/web.config。别忘了,这也适用于连接字符串 我有同样的问题但没有解决方案:( 谢谢,也解决了我的问题。虽然我们正在通过存储库模式与 SOC 合作。网络项目中仍然必须引用 EF... 这为我指明了正确的方向,但对我来说,另一个缺失的部分是在我的项目中手动添加对 EntityFramework.SqlServer 的引用。这在 EF6 中都是必需的 这也修复了我的问题,但不确定这是一个正确的方法。无论如何感谢您的修复:)【参考方案3】:

我有同样的问题,不同的是我无法访问源代码。 我通过将正确版本的 EntityFramework.SqlServer.dll 放在应用程序的 bin 目录中解决了我的问题。

【讨论】:

【参考方案4】:

我刚刚解决了。您需要在解决方案中再次安装 Entity Framework。遵循任何一种方法。

首先 = 右键单击​​您的解决方案或项目根目录,然后单击Manage NuGet Packages。选择“EntityFramework”,选择合适的项目并点击确定。

第二次 = 转到控制台包管理器并运行Install-Package EntityFramework

希望对你有帮助。

【讨论】:

右键单击解决方案根目录并管理 Nuget 包。容易。赢。我添加了一个项目,但自然而然地在新项目中丢失了它。 我明白你的意思,它也是正确的。如果您愿意,请改进我的答案。谢谢:)【参考方案5】:

亨德利的答案是 100% 正确的。我的应用程序遇到了同样的问题,其中有一个使用封装 EF db 上下文操作的方法来处理数据库的存储库项目。其他项目使用此存储库,我不想在这些项目中引用 EF。不知何故,我觉得它不合适,我只需要在存储库项目中使用 EF。 无论如何,将 EntityFramework.SqlServer.dll 复制到其他项目输出目录即可解决问题。为避免出现问题,当您忘记复制此 dll 时,您可以更改存储库构建目录。转到存储库项目的属性,选择构建选项卡,然后在输出部分中,您可以将输出目录设置为其他项目的构建目录。 当然,这只是解决方法。也许在某些地方提到的 hack 更好:

var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;

不过,出于开发目的,这已经足够了。稍后,在准备安装或发布时,您可以将此文件添加到包中。

我对 EF 还是很陌生。有没有更好的方法来解决这个问题?我不喜欢“hack”——它让我觉得有些东西“不安全”。

【讨论】:

【参考方案6】:

我已经在我的 DBContext 中使用以下代码解决了这个问题

公共部分类 Q4Sandbox : DbContext 公共 Q4Sandbox() : base("name=Q4Sandbox") 公共虚拟 DbSet 员工 获取;放; 受保护的覆盖无效 OnModelCreating(DbModelBuilder modelBuilder) var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;

感谢 SO 成员。

【讨论】:

等等,您提供的代码无法修复来自 OP 的错误?你甚至没有使用“实例”。 Leon,我正在使用实例! 你试过源代码了吗?你也遇到过这个问题吗?我遇到了这个问题并解决了它。另外对于您的问题,请检查我编写的代码由微软建议 我只是将这一行 (var instance = System....) 放在我的 DBContext 类中,如此处所示,无需修改 app.config 或将 dll 复制到构建文件夹中,它就可以工作。对于 VB 程序员:“Dim instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance”。非常感谢。 谢谢先生,我的代码中也没有。似乎它无法从 App.config 文件中获取实例 :) :)【参考方案7】:

将“EntityFramework.SqlServer.dll”添加到您的 bin 文件夹中。问题将得到解决。

【讨论】:

【参考方案8】:

尝试添加以下运行时程序集绑定:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

【讨论】:

嗯,感谢您的回答,我发现了一些问题。我的 ASP.NET 项目仍然有对 EF 的引用,但它的目标是 EF5。我将其更改为 EF6,但不幸的是,这并没有解决问题。【参考方案9】:

我遇到了同样的问题,唯一对我有用的是使用 Uninstall-Package 从每个项目中卸载实体框架包。然后在整个解决方案中再次安装它。它会要求您选择要安装在哪个项目中,您应该全选。

【讨论】:

【参考方案10】:

对我有用的是从 EF 6.1.3 降级到 EF 6.1.1

Visual Studios 2012+ 中前往:

工具 - Nuget 包管理器 - 包管理器控制台`

然后输入:

Install-Package EntityFramework.SqlServerCompact -Version 6.1.1

我不必先卸载EF 6.1.3,因为上面的命令已经这样做了。

另外,不知道有没有什么作用,不过我的项目中也安装了SQL Server CE。

这是我找到的解决方案的链接:

http://www.itorian.com/2014/11/no-entity-framework-provider-found-for.html

【讨论】:

【参考方案11】:

我也有类似的问题

通过执行以下操作解决了我的问题:

【讨论】:

【参考方案12】:

在每个项目中安装实体框架(例如:在 Web 中,在类库中)从 NuGet 包管理器或打开 工具 - Nuget 包管理器 - 包管理器控制台 并使用 Install-Package EntityFramework 安装实体框架。

不需要在每个配置文件中添加以下代码。默认会添加到通过Entity Framework调用数据库的项目中。

<entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> </entityFramework>

【讨论】:

【参考方案13】:

这个问题可能是由于错误的实体框架引用,或者有时类名与数据库中的实体名不匹配。确保表名与类名匹配。

【讨论】:

以上是关于错误:找不到具有不变名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序的主要内容,如果未能解决你的问题,请参考以下文章

找不到具有不变名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序。

找不到具有不变名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序。

在 ASP.NET Core Web API 的已注册 .NET 数据提供程序列表中找不到指定的不变名称“System.Data.sqlClient”

具有不变名称“System.Data.SqlServerCe.4.0”的 ADO.NET 提供程序未注册

无法加载具有不变名称“System.Data.SqlServerCe.4.0”的 ADO.NET 提供程序

找不到类型或命名空间名称“SqlConnection”(是不是缺少 using 指令或程序集引用?)