583

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

找不到具有不变名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序。确保提供程序已在应用程序配置文件的“entityFramework”部分注册。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=260882

在此处输入图像描述

4

35 回答 35

654

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

我设法通过在包管理器控制台上运行以下命令来修复它:

PM> Install-Package EntityFramework
于 2013-09-05T17:28:07.050 回答
405

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

于 2013-11-18T10:24:47.990 回答
217

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

总之:

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

我希望它有所帮助。

于 2014-04-09T18:18:55.103 回答
115

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

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

于 2013-11-04T21:04:32.093 回答
58

无需将 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/

于 2015-04-20T09:17:28.100 回答
50

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

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

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

public void FixEfProviderServicesProblem()
{
    var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
}

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

于 2014-04-18T20:16:18.183 回答
27

添加此功能

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

.

于 2016-03-16T13:16:16.733 回答
22

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

您需要进行引用,因此它将被复制到 den 应用程序路径中。因为后面会在运行时引用。所以你不需要复制任何文件。

private volatile Type _dependency;

public MyClass()
{
    _dependency = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
}
于 2014-04-14T12:20:40.967 回答
8

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

于 2014-04-29T05:39:28.013 回答
8

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

  • 实体框架.dll
  • EntityFramework.SqlServer.dll

在启动项目的 .config 文件中添加 a<section>会使<configSections>该 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 可用,虽然不实用,但可以从实体框架项目的 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\
于 2018-06-16T14:12:32.803 回答
8

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

[DeploymentItem("EntityFramework.SqlServer.dll")]
于 2015-09-30T09:27:22.157 回答
7

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

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

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

您面临同样问题的迹象:

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

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

于 2014-02-12T16:54:15.537 回答
5

将以下内容添加到您的 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>
于 2015-12-01T18:33:13.900 回答
4

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

于 2015-03-26T12:40:55.670 回答
4

我也有类似的问题。通过执行以下操作解决了我的问题:

在此处输入图像描述

在此处输入图像描述

于 2017-10-12T15:07:45.450 回答
4

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

于 2018-08-17T08:01:14.820 回答
3

删除 BIN 文件夹为我做了

于 2014-01-31T19:18:02.457 回答
3

只需将 EntityFramework.SqlServer.dll 复制到 bin 文件夹中

于 2020-05-03T01:46:26.610 回答
3

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

  1. 如果您已经有一个DbConfiguration类:

    public class MyConfiguration : DbConfiguration
    {
        public MyConfiguration()
        {
            this.SetProviderServices(System.Data.Entity.SqlServer.SqlProviderServices.ProviderInvariantName, System.Data.Entity.SqlServer.SqlProviderServices.Instance);
        }
    }
    
  2. 如果您没有DbConfiguration类,则必须在应用启动时放置以下代码(在使用 EF 之前):

    static MyContext()
    {
        DbConfiguration.Loaded += (sender, e) =>
            e.ReplaceService<DbProviderServices>((s, k) => System.Data.Entity.SqlServer.SqlProviderServices.Instance);
    }
    
于 2017-03-01T20:51:23.357 回答
2

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

我认为问题会得到解决。

于 2014-12-04T08:17:10.227 回答
2

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

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

<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6"/>
于 2018-08-30T22:30:06.367 回答
2

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

于 2018-05-31T14:21:05.373 回答
2

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

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

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

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

于 2017-06-01T14:38:27.417 回答
2

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

var results = _dbContext.MyModel.ToList();

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

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

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

在此处输入图像描述

于 2018-03-07T13:28:03.437 回答
1

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

于 2014-03-28T21:40:13.347 回答
1

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

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

于 2016-05-27T12:21:06.773 回答
1

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

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

于 2016-07-10T15:15:14.733 回答
1

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

于 2021-02-18T17:31:06.890 回答
1

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

我按照以下步骤解决了这个问题:

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

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

我希望它有所帮助。

于 2016-11-04T18:29:45.117 回答
0

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

于 2013-11-25T23:37:13.083 回答
0

我抛出了相同的异常。包括我

using System.Data; 
using System.Data.Entity;

一切都恢复了工作..

于 2015-03-21T13:37:30.200 回答
0

我遇到了同样的问题,只是将包含 DBContext 的项目中的 App Config 文件复制到我的测试项目中

于 2015-01-08T14:02:31.233 回答
0

就我而言,一切正常,然后突然停止工作,因为我认为 Resharper 更改了一些导致问题的更改。我的项目分为数据层、服务层和表示层。我在我的数据层中安装并引用了实体框架,但错误仍然没有消失。卸载和重新安装也没有用。最后,我通过将数据层设为 Startup 项目、进行迁移、更新数据库并将 Startup 项目改回我的表示层来解决它。

于 2017-05-23T04:29:04.617 回答
0

注意:我在从模型生成数据库 Sql 时遇到了这个问题。它已经很好地创建了所有表,但不会导出更改。您需要注意的是,当您尝试使用 DDL 生成模板将 sql 导出为 SSDLtoSQL10 时,会产生此错误。这里需要 MySQL 连接,因此请确保从模型属性的下拉 DDL 生成模板 SSDLtoMySQL 中进行选择。花了一整天的时间!

于 2016-08-23T13:46:23.930 回答
0

如消息所示,我们需要添加提供者 System.Data.SqlClient 这就是为什么我们需要安装具有两个 dll 的 EntityFramework 的 nuget 包,但如果我们只开发控制台应用程序,那么我们只需要添加 EntityFramework.SqlServer.dll 的引用

于 2015-08-28T05:32:44.870 回答