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

时间:2013-08-27 01:58:12

标签: entity-framework

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

  

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

enter image description here

35 个答案:

答案 0 :(得分:551)

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

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

PM> Install-Package EntityFramework

答案 1 :(得分:362)

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

答案 2 :(得分:195)

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

总结:

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

我希望它有所帮助。

答案 3 :(得分:110)

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

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

答案 4 :(得分:46)

不是将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/

答案 5 :(得分:45)

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

有时上述内容不适用于测试项目

要在Test Project中解决此问题,只需将此方法放在Test Project中:

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

这个方法从未被调用,但正如我的观察,编译器将删除所有"不必要的"程序集并且不使用EntityFramework.SqlServer内容,测试失败。

答案 6 :(得分:21)

添加此功能

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

答案 7 :(得分:19)

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

  

您需要创建一个引用,因此它将在den应用程序中复制   路径。因为稍后它将在运行时引用。所以你不要   需要复制任何文件。

private volatile Type _dependency;

public MyClass()
{
    _dependency = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
}

答案 8 :(得分:8)

使用Entity Framework 6和SQL Server Compact 4.0时出现了同样的错误。有关EF6的Entity Framework Providers MSDN上的文章很有帮助。在Package Manager Console中以nuget包的形式运行相应的提供程序命令可能会解决问题,因为NuGet包也会自动将注册添加到配置文件中。我跑PM> Install-Package EntityFramework.SqlServerCompact来解决问题。

答案 9 :(得分:7)

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

export class ContentDirective implements angular.IDirective {
public priority =  10;
public restrict = 'A';

static $inject = [
    "$window"
];

constructor(private $window) {

}

public link: angular.IDirectiveLinkFn = (scope: angular.IScope, element: angular.IAugmentedJQuery, attrs): void => {
    scope.$watch(attrs.ngBindHtml, () => {
        this.handleResize(element);
    });
};

private handleResize(element): void {
    var win = angular.element(this.$window),
    // Find all iframes
        $allVideos = element.find("iframe"),
    // The element that is fluid width
        $fluidEl = element;

    // Figure out and save aspect ratio for each iframe
    $allVideos.each(function () {
        $(this)
            .data('aspectRatio', this.height / this.width)
            // and remove the hard coded width/height
            .removeAttr('height')
            .removeAttr('width');
    });

    // When the window is resized
    win.resize(() => {
        var newWidth = $fluidEl.width();
        // Resize all iframes according to their own aspect ratio
        $allVideos.each(function () {
            var $el = $(this);
            $el
                .width(newWidth)
                .height(newWidth * $el.data('aspectRatio'));
        });
    }).resize();
}

public static factory(): angular.IDirectiveFactory {

    var directive = ($window) => {
        return new ContentDirective($window);
    };

    directive.$inject = ['$window'];
    return directive;
}
}

答案 10 :(得分:5)

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

我在EF5上使用此设置已有一段时间了,无需在Integration Test Project中包含对EF的引用。

现在,在升级到EF6之后,似乎我还需要在集成测试项目中包含对EF6的引用,即使它没有在那里使用(几乎由user3004275指出)。 / p>

您遇到同样问题的迹象:

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

第三点是什么让我离开了一段时间,我仍然不确定为什么这是必需的。在我的Integration Test项目中添加ref到EF6解决了它...

答案 11 :(得分:4)

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

答案 12 :(得分:4)

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

  • EntityFramework.dll
  • EntityFramework.SqlServer.dll

在启动项目的.config文件的<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可用,虽然不实用,但可以从Entity Framework项目的bin文件夹中创建手动副本。 更好的选择是向Entity Framework项目的Post-Build事件添加以下行,这将自动化该过程:

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

答案 13 :(得分: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);
    }
    

答案 14 :(得分:3)

删除BIN-Folder为我做了

答案 15 :(得分:3)

将以下内容添加到您的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>

答案 16 :(得分:2)

我刚刚使用Nuget重新安装了Entity Framework。 并按照以下链接中的说明操作: http://robsneuron.blogspot.in/2013/11/entity-framework-upgrade-to-6.html

我认为问题会得到解决。

答案 17 :(得分:2)

我也有类似的问题。通过以下方式解决了我的问题:

enter image description here

enter image description here

答案 18 :(得分:1)

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

var results = _dbContext.MyModel.ToList();

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

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

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

enter image description here

答案 19 :(得分:1)

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

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

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

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

答案 20 :(得分:1)

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

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

  1. 右键单击解决方案,然后选择选项&#39;管理解决方案的NuGet包&#39;和NuGet包管理器窗口将显示。
  2. 转到&#39;管理&#39; “已安装的软件包”下的选项&#39; 提示:实体框架已添加到类库中,因此您将在“已安装的软件包”下安装EntityFramework。并且您将看到“管理”选项
  3. 点击&#39;管理&#39;选项并检查安装包到项目,该项目引用了包含EF模型的类库(在我的情况下,我设置复选框将软件包安装到控制台应用程序,该应用程序引用了内置EF模型的类库)
  4. 这就是我必须做的一切,一切都很完美。

    我希望它有所帮助。

答案 21 :(得分:1)

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

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

答案 22 :(得分:1)

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

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

答案 23 :(得分:1)

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

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

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

答案 24 :(得分:1)

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

答案 25 :(得分:1)

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

答案 26 :(得分:0)

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

答案 27 :(得分:0)

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

答案 28 :(得分:0)

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

答案 29 :(得分:0)

在我的情况下,一切正常,然后突然停止工作,因为我认为Resharper改变了导致问题的一些变化。我的项目分为数据层,服务和表示层。我在我的数据层中安装并引用了Entity框架,但错误仍未消失。卸载和重新安装也不起作用。最后,我通过使数据层成为Startup项目,进行迁移,更新数据库以及将Startup项目更改回我的表示层来解决它。

答案 30 :(得分:0)

注意:从Model中生成数据库Sql时出现此问题。它创建了所有表格,但不会导出更改。您需要注意的是,当您尝试使用DDL生成模板作为SSDLtoSQL10导出sql时会生成此错误。它在这里期待MySQL连接,因此请确保从Model属性上的下拉DDL生成模板SSDLtoMySQL中进行选择。花了一整天的时间!

答案 31 :(得分:0)

从Azure数据库迁移到Azure上的Sql Server时,我遇到了相关问题。只是浪费了4小时试图解决这个问题。希望这可以为某人留下类似的命运。对我来说,我在packages.config文件中引用了SqlCE。删除它解决了我的整个问题,并允许我使用迁移。是的,微软为另一项技术提供了不必要的复杂设置和配置问题。

答案 32 :(得分:0)

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

答案 33 :(得分:0)

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

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

一切又回来了......

答案 34 :(得分:0)

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