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

Posted

技术标签:

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

通过nuget下载EF6并尝试运行我的项目后,返回如下错误:

。确保提供程序已在应用程序配置文件的“entityFramework”部分注册。请参阅http://go.microsoft.com/fwlink/?LinkId=260882 了解更多信息。

【问题讨论】:

我使用的 EF5 没有 providersprovider 的东西,所以考虑删除它吗? 把你的连接字符串的副本放在这里 连接字符串在图片中(App.confing),顺便说一下很简单,我调用构造函数,public BaseStorage(): base ("RaptorDB") ,BaseStorage()继承自EF5中的DbContext,一切正常,不是已经在 EF6 中。 问题将通过安装EF6,第二个项目(Console)来解决,感谢所有帮助过的人! 对我来说,这似乎是由于 Visual Studio 没有意识到基础项目实际使用了 EntityFramework.SqlServer 程序集造成的。如果您执行@Carra's answer 之类的操作,则不必将 EF 添加到引用您的基础项目的每个项目中 - 更简洁。 【参考方案1】:

我刚刚遇到了同样的问题,虽然从 NuGet 包管理器安装的 EntityFramework 看起来没有正确安装在项目中。

我设法通过在Package Manager Console 上运行以下命令来修复它:

PM> Install-Package EntityFramework

【讨论】:

PMC 写道已经安装了“EntityFramework 6.0.1”,但将其添加到我的控制台应用程序中(实际上它没有使用 EF),但它也为我解决了问题。我从控制台应用程序引用中删除了 EF,错误返回,我不明白 - 我的控制台应用程序正在使用存储库项目(它使用 EF)感谢您的帮助! 如果您的解决方案中有多个项目,请不要忘记将 -ProjectName 添加到命令行...!!! 使用 -Pre 选项告诉 nuget 安装预发布包。我不建议使用它。我有类似的错误,但解决方案是在宿主项目中安装 EntityFramework。我已将其安装在类库中,但未安装在主项目(web/console/或其他)中, 这里有同样的问题。我有一个项目没有对 EF 的引用,但 EF dll 在 Debug 文件夹中。对这个项目运行这个命令将 EntityFramework.SqlServer.dll 添加到 Debug 文件夹 - 问题解决了。 在我的情况下,直到我将项目部署到我们的测试服务器上,这个错误才出现。实际上,缺少的是 EntityFramework.SqlServer.dll 并且通过包管理器安装 EF 是有效的。它只是将两个相关引用添加到项目中,然后将 entityFramework 设置添加到 web.config。我猜本地 IIS 能够在本地获取程序集,但由于权限,Web 服务器上的完整 IIS 不能?【参考方案2】:

您已将 EF 添加到类库项目中。您还需要将其添加到引用它的项目中(您的控制台应用程序、网站或其他)。

【讨论】:

这是一个绝对荒谬的答案。为什么我需要这样做?你知道什么更可笑吗?它有效。 看下面我的回答,你不需要在你的控制台应用中安装EF。 你的回答是正确的。仅将引用 EntityFramework.SqlServer.dll 添加到使用带有 EF 的库的前端项目中,修复问题。所以不要使用这个EF(只有DLL) 您不必必须在控制台/Web 应用程序中添加对 EF 的引用。您只需要确保将EntityFramework.SqlServer.dll 复制到bin 目录。添加强引用可能会破坏您的体系结构(如果您构建了多个层,那么您的***执行程序集甚至不应该知道 EF)。相反,您可以确保复制 SQL Server 提供程序。参见例如***.com/a/19130718/870604 我怀疑 EntityFramework.SqlServer.dll 未被检测为依赖项的原因是实体框架动态加载它。当对 SQL 提供程序的唯一引用在配置文件中时,您的项目应该如何知道复制它?【参考方案3】:

您无需在控制台应用程序中安装 Entity Framework,只需添加对程序集 EntityFramework.SqlServer.dll 的引用。您可以将此程序集从使用实体框架的类库项目复制到 LIB 文件夹并添加对它的引用。

总结:

类库应用程序: 安装实体框架 编写数据层代码 app.config 文件包含与实体框架相关的所有配置,但连接字符串除外。 创建控制台、Web 或桌面应用程序: 添加对第一个项目的引用。 添加对 EntityFramework.SqlServer.dll 的引用。 app.config/web.config 有连接字符串(请记住,配置条目的名称必须与 DbContext 类的名称相同。

希望对你有帮助。

【讨论】:

正确答案。无需安装 EF。 EntityFramework.SqlServer.dll . 我必须同意。这完全是正确答案。引用 1/2 mb 的 dll 或拉出 > 5.5 mb 的 EF nuget 项目。也减少了一点架构多层的价值。 MS 的表现真的很差:我有 4 层,我的顶层真的没有理由对 EF 有任何了解 还是很可笑。例如为什么前端需要对 SqlServer 的引用?就我而言,前端不在乎。但它有效。 +1 这很有帮助。非常感谢。 这不会让更新 EntityFramework 的版本变得困难吗?你必须记得去更新对 DLL 的引用【参考方案4】:

如果您忘记包含“EntityFramework.SqlServer.dll”,您也可以看到此消息。

它似乎是 EF6 中新添加的文件。最初我没有将它包含在我的合并模块中并遇到了此处列出的问题。

【讨论】:

当我之前有一个项目 (a) 引用了一个项目 (b) 引用了 EF 时,我遇到了这个问题。清理和删除项目 (a) bin 文件夹,然后重建后,遇到了 EF 引用,但没有遇到 EF.SqlServer.dll。手动复制这个对我有用 @dan richardson 感谢您提到“删除 bin 文件夹”。 在 EF6 升级后尝试运行 LINQPad 脚本时出现错误。即使在 LINQPad 中引用 EntityFramework.SqlServer.dll 也没有修复它,直到我在 VS2013 中重建了我的解决方案。然后新的引用在 LINQPad 中正确解析,我的脚本运行了! 在我的情况下,我在开发环境中还可以,但是当我发布时出现了引用的问题。在将 dev 中的库列表与服务器中的 bin 文件夹进行比较后,我注意到没有 EntityFramework.SqlServer.dll,我只是上传它并刷新应用程序,瞧它修复了。 这是我的问题,谢谢!请参阅@Anders 提供的干净解决方案,以避免忘记在每个所需项目中包含 DLL 的问题。【参考方案5】:

您可以确保从您的模型/实体项目中对它进行静态引用,而不是将 EntityFramework.SqlServer 添加到宿主项目中,就像这样

static MyContext()

    var type = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
    if(type == null)
        throw new Exception("Do not remove, ensures static reference to System.Data.Entity.SqlServer");

这将使构建过程包括带有宿主项目的程序集。

我的博客上的更多信息 http://andersmalmgren.com/2014/08/20/implicit-dependencies-and-copy-local-fails-to-copy/

【讨论】:

我认为这是一个很好的干净解决方案,我们不必在应该与持久性无关的项目中包含对持久性相关 DLL 的引用。 同意,它适用于任何具有隐式依赖关系的库,而不仅仅是持久性 当您对程序集中的类型有显式依赖时,构建过程将复制该类型。但是,在这里您没有显式依赖关系,并且构建过程将无法将程序集复制到构建文件夹。我的代码只是确保在所述程序集中存在对任何类型的显式引用。 没有它,您的代码对程序集没有明确的依赖关系,它不会被复制到输出 这太棒了。【参考方案6】:

当您通过 Nuget 安装 Entity Framework 6 时。 EntityFramework.SqlServer 有时会错过另一个可执行文件。只需将Nuget 包添加到该项目即可。

有时以上不适用于测试项目

要在测试项目中解决这个问题,只需将此方法放在测试项目中:

public void FixEfProviderServicesProblem()

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

从未调用过此方法,但根据我的观察,编译器将删除所有“不必要的”程序集,并且在不使用 EntityFramework.SqlServer 的情况下测试失败。

【讨论】:

这不是很漂亮,但它解决了我在测试项目中遇到的问题。其他解决方案均无效。 在我的情况下,将实体框架也添加到我的“管理解决方案的 Nuget 数据包”中的测试项目中就足够了 实际上您需要放入任何项目(不仅是测试)以确保 System.Data.Entity.SqlServer 在编译后将包含在“结果库集”中(注意:Unity 或其他 IoC工具可以更改此规则,您将需要从测试项目中调用此代码)。 这实际上是最好的解决方案,因为您不必在项目中到处喷洒实体框架引用。 这为我指明了正确的方向。 EntityFramework.SqlServer 已添加到您的类库中,但如果不使用,它将不会放在应用程序的输出文件夹中。我通过添加ExecutionStrategy 解决了这个问题,我仍然需要这样做,因此在DbConfiguration 类中添加类似SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy()); 的行解决了问题。【参考方案7】:

添加此功能

private void FixEfProviderServicesProblem()

到库类中的数据库上下文类和缺少的DLL EntityFramework.SqlServer.dll 将被复制到正确的地方。

namespace a.b.c

    using System.Data.Entity;

    public partial class WorkflowDBContext : DbContext
    
        public WorkflowDBContext()
            : base("name=WorkflowDBConnStr")
        
        

        public virtual DbSet<WorkflowDefinition> WorkflowDefinitions  get; set; 
        public virtual DbSet<WorkflowInstance> WorkflowInstances  get; set; 
        public virtual DbSet<EngineAlert> EngineAlerts  get; set; 
        public virtual DbSet<AsyncWaitItem> AsyncWaitItems  get; set; 
        public virtual DbSet<TaskItem> TaskItems  get; set; 
        public virtual DbSet<TaskItemLink> TaskItemLinks  get; set; 

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        
        

        private void FixEfProviderServicesProblem()
        
            // The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer'
            // for the 'System.Data.SqlClient' ADO.NET provider could not be loaded. 
            // Make sure the provider assembly is available to the running application. 
            // See http://go.microsoft.com/fwlink/?LinkId=260882 for more information.
            var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
        
    

.

【讨论】:

抱歉试图撤销它......因为我认为它不会起作用......它确实有效!......它说我不能改变我的投票,除非答案被编辑,因为它太长了,已经被锁定了...... 这对我也有用。我们有一个使用 EF 6 的库项目和一个使用该库的控制台应用程序。我们得到了与 OP 相同的异常。我们不希望将 EntityFramework 特定的配置放在应用程序配置文件中,所以这种方法对我们有用。谢谢 你在哪里打电话FixEfProviderServicesProblem我在构造函数中试过了,没有运气。 我从不叫它——不必。存在的事实使 .net 认为它需要它并包含 EntityFramwork 作为依赖项。 可能来自***.com/a/19130718/1467396?但无论如何,+1 是为了明确如何/在哪里使用它。【参考方案8】:

这些都不适合我。我确实在another *** question 中找到了解决方案。我将在此处添加以方便参考:

你需要做一个引用,所以它会被复制到 den 应用程序中 小路。因为后面会在运行时引用。所以你不 需要复制任何文件。

private volatile Type _dependency;

public MyClass()

    _dependency = typeof(System.Data.Entity.SqlServer.SqlProviderServices);

【讨论】:

这个!无需添加对可能引用此程序集的其他项目的引用。【参考方案9】:

我在使用 Entity Framework 6 和 SQL Server Compact 4.0 时遇到了同样的错误。 EF6 的 Entity Framework Providers 在 MSDN 上的文章很有帮助。在包管理器控制台上将相应的提供程序命令作为 nuget 包运行可能会解决问题,因为 NuGet 包也会自动将注册添加到配置文件中。我跑了PM&gt; Install-Package EntityFramework.SqlServerCompact来解决这个问题。

【讨论】:

我真的很惊讶到目前为止没有人为此投票!错误消息清楚地说明:错误的原因是在 EF 升级之后,应用程序的 web.config 文件中确实没有为 SQL Compact 留下提供程序定义!添加您提到的软件包修复了 web.config 文件,并且将定义提供程序。 简直就是救命稻草。它应该被标记为答案,因为它清楚地提供了问题的解决方案【参考方案10】:

当测试项目中发生错误时,最漂亮的解决方案是用以下方式装饰测试类:

[DeploymentItem("EntityFramework.SqlServer.dll")]

【讨论】:

确实很漂亮,但会产生更多的工作并且更容易忘记。使用“强制引用”技巧,您只需要在真正需要使用 EF 的项目上执行此操作。【参考方案11】:

引用正在使用Entity Framework的项目的启动项目需要在其bin文件夹中包含以下两个程序集:

EntityFramework.dll EntityFramework.SqlServer.dll

在启动项目的 .config 文件的 &lt;configSections&gt; 中添加 &lt;section&gt; 可以使该 bin 目录中的第一个程序集可用。您可以从 Entity Framework 项目的 .config 文件中复制它:

<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>

要使 bin 文件夹中的第二个 .dll 可用,虽然不切实际,但可以从 Entity Framework 项目的 bin 文件夹中进行手动复制。 一个更好的选择是在 Entity Framework 项目的 Post-Build Events 中添加以下行,这将自动化该过程:

cd $(ProjectDir)
xcopy /y bin\Debug\EntityFramework.SqlServer.dll ..\PATH_TO_THE_PROJECT_THAT_NEEDS_THE_DLL\bin\Debug\

【讨论】:

谢谢,我在数据层中有实体框架,所以它是隔离的,但不幸的是,微软不允许我们真正隔离数据层并让我们用数据库技术污染用户体验。我希望我不必那样做。【参考方案12】:

今天在使用一组 Web 服务时遇到了这个问题,每个服务都在不同的项目中,并且在一个单独的项目中包含对其中一些服务的集成测试。

我在 EF5 中使用此设置已有一段时间了,无需在集成测试项目中包含对 EF 的引用。

现在,在升级到 EF6 之后,我似乎也需要在集成测试项目中包含对 EF6 的引用,即使它没有在那里使用(几乎就像上面 user3004275 指出的那样)。

您面临同样问题的迹象:

直接调用 EF(连接到数据库、获取数据等)工作正常,只要它们是从引用 EF6 的项目启动的。 通过发布的服务接口调用服务工作正常;即服务中没有“内部”缺失的引用。 从服务外的项目直接调用服务项目中的公共方法会导致此错误,即使该项目本身没有使用EF;仅在被调用项目内部

第三点让我有一段时间不满意,但我仍然不确定为什么需要这样做。在我的集成测试项目中添加对 EF6 的引用无论如何都解决了它......

【讨论】:

【参考方案13】:

将以下内容添加到您的 app.config。

 <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>

【讨论】:

您还需要注册到&lt;configSections&gt; - &lt;section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /&gt; 这就是“IInstall-Package EntityFramework”所做的。这并不是真正必要的,因为默认情况下 EntityFramework 会尝试为 SqlClient 不变名称加载 EntityFramework.SqlServer.dll。该方法可用于替代提供者。【参考方案14】:

我今天刚遇到这个问题。我有带有 EF63 NuGet 包和用于测试的控制台应用程序的数据存储库类库,它们仅引用类库项目。我创建了非常简单的构建后命令,它将 EntityFramework.SqlServer.dll 从类库的 Bin\Debug 文件夹复制到控制台应用程序的 Bin\Debug 文件夹并解决了问题。不要忘记将 entityFramework 部分添加到控制台应用程序的 .config 文件中。

【讨论】:

【参考方案15】:

我也遇到了类似的问题。我的问题通过以下方法得到解决:

【讨论】:

【参考方案16】:

您只是缺少对 EntityFramework.SqlServer.dll 的引用。对于使用 SQL Server 的 EntityFramework 项目,需要参考的两个文件是 EntityFramework.SqlServer.dll 和 EntityFramework.dll

【讨论】:

【参考方案17】:

删除 BIN 文件夹对我有用

【讨论】:

【参考方案18】:

您应该强制对 EntityFramework.SqlServer.dll 程序集进行静态引用,但是您可以用更漂亮的方式来代替放置虚拟代码:

    如果你已经有一个 DbConfiguration 类:

    public class MyConfiguration : DbConfiguration
    
        public MyConfiguration()
        
            this.SetProviderServices(System.Data.Entity.SqlServer.SqlProviderServices.ProviderInvariantName, System.Data.Entity.SqlServer.SqlProviderServices.Instance);
        
    
    

    如果您没有 DbConfiguration 类,则必须在应用启动时(在使用 EF 之前)放置以下代码:

    static MyContext()
    
        DbConfiguration.Loaded += (sender, e) =>
            e.ReplaceService<DbProviderServices>((s, k) => System.Data.Entity.SqlServer.SqlProviderServices.Instance);
    
    

【讨论】:

【参考方案19】:

只需复制 EntityFramework.SqlServer.dll 进入bin文件夹

【讨论】:

【参考方案20】:

我刚刚使用 Nuget 重新安装了实体框架。 并按照以下链接上的说明进行操作: http://robsneuron.blogspot.in/2013/11/entity-framework-upgrade-to-6.html

我认为问题会得到解决。

【讨论】:

一个解释会很好!为什么你必须重新安装它等等 由于某些未知原因,更改不会生效,所以我重新安装了 EntityFramework 6.1.1,然后它才生效。【参考方案21】:

展开 YourModel.edmx 文件并打开 YourModel.Context.tt 下的 YourModel.Context.cs 类。

我在 using 部分添加了以下行,错误已为我修复。

使用 SqlProviderServices = System.Data.Entity.SqlServer.SqlProviderServices;

您可能必须在每次自动生成文件时将此行添加到文件中。

【讨论】:

【参考方案22】:

我有同样的错误。奇怪的是,只有当我使用 dbContext 查询我的任何模型或获取它的列表时才会发生这种情况:

var results = _dbContext.MyModel.ToList();

我们尝试重新安装实体框架,正确引用它但无济于事。

幸运的是,我们尝试检查 Nuget 以获取 ALL 解决方案,然后更新所有内容或确保 everything 是相同版本,因为我们注意到这两个项目在 Web 项目上具有不同的 EF 版本。它有效。错误消失了。

这是有关如何为所有解决方案管理 Nuget 的屏幕截图:

【讨论】:

【参考方案23】:

只需将 EntityFramework 包安装到您的 Web/控制台项目。这应该将该部分添加到您的配置文件中。

【讨论】:

【参考方案24】:

似乎没有人提到首先检查系统中是否安装了 System.Data.SqlClient 以及是否对其进行了引用。

我通过安装 System.Data.SqlClient 并在 app.Config 中添加新提供程序解决了我的问题

<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6"/>

【讨论】:

【参考方案25】:

另外,请确保您启动的项目是包含您的 dbcontext(或相关的 app.config)的项目。我正在尝试启动一个没有所有必要配置设置的网站项目。

【讨论】:

【参考方案26】:

我几乎尝试了以上所有方法,但没有任何效果。

只有当我将默认项目EntityFrameworkEntityFramework.SqlServer 属性Copy Local 中引用的DLL 设置为True 时,它才开始工作!

【讨论】:

这些已经存在于 EntityFramework (6.4.4) 的编译时程序集中。位置是 C:\Users\\.nuget\packages\entityframework\6.4.4\lib\netstandard2.1。您能否分享一下您为使这些“参考”所做的工作?【参考方案27】:

每个人都需要注意,两个 dll EntityFramework.dll 和 EntityFramework.SqlServer.dll 是 DataAccess 层库,在视图或任何其他层中使用它们是不合逻辑的。它解决了您的问题,但它不合逻辑。

逻辑方法是删除实体属性并用 Fluent API 替换它们。这是真正的解决方案

【讨论】:

【参考方案28】:

我有一个控制台应用程序和类库。在类库中,我创建了实体数据模型(右键单击类库 > 添加 > 新项 > 数据 > ADO.NET 实体数据模型 6.0)并将引用放入控制台应用程序中。因此,您有控制台应用程序,它引用了类库,并且在类库中您有 EF 模型。当我尝试从表中获取一些记录时,我遇到了同样的错误。

我通过以下步骤解决了这个问题:

    右键单击解决方案并选择“管理解决方案的 NuGet 包”选项,然后将显示 NuGet 包管理器窗口。 转到“已安装包”下的“管理”选项 提示:实体框架已添加到类库中,因此您将在“已安装包”下拥有 EntityFramework,您将看到“管理”选项 单击“管理”选项并选中将包安装到引用包含 EF 模型的类库的项目(在我的情况下,我设置了复选框以将包安装到控制台应用程序,该应用程序引用了具有 EF 模型的类库里面)

这就是我所要做的,一切都很完美。

希望对你有帮助。

【讨论】:

【参考方案29】:

我有同样的问题(在我的 3 轮胎级项目中),我通过将 EF 添加/安装到我的主项目来解决它。

【讨论】:

【参考方案30】:

从 CE db 迁移到 Azure 上的 Sql Server 时,我遇到了一个相关问题。只是浪费了 4 小时试图解决这个问题。希望这可以挽救一个类似的命运。对我来说,我的 packages.config 文件中有对 SqlCE 的引用。删除它解决了我的整个问题并允许我使用迁移。 Yay Microsoft 为另一种技术提供了不必要的复杂设置和配置问题。

【讨论】:

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

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

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

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

Angular 7:“找不到具有未指定名称属性的控件”

找不到具有名称/键 X 的资源

“找不到具有名称的端点元素...”