错误:找不到具有不变名称“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”并保存所有内容,以获取项目将<Private>
节点放入.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 提供程序未注册