找不到名称为“System.Data.SqlClient”的ADO.NET提供程序的entity framework提供程序

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

ADO.NET提供程序找不到名称为“System.Data.SqlClient”的entity framework提供程序。 确保提供程序在应用程序configuration文件的“entityFramework”部分中注册。 有关更多信息,请参阅http://go.microsoft.com/fwlink/?LinkId=260882 。

在这里输入图像说明

我刚进入相同的问题,它看起来像EntityFramework,虽然从NuGet包pipe理器安装没有正确安装在项目中。

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

 PM> Install-Package EntityFramework 

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

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

综上所述:

  • 类库应用程序:
    • 安装entity framework
    • 编写你的数据层代码
    • 除连接string外,app.config文件具有与entity framework相关的所有configuration。
  • 创build一个控制台,Web或桌面应用程序:
    • 添加对第一个项目的引用。
    • 添加对EntityFramework.SqlServer.dll的引用。
    • app.config / web.config具有连接string(请记住,configuration条目的名称必须与DbContext类的名称相同。

我希望它有帮助。

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

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

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

有时以上不适用于testing项目

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

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

这个方法从来没有被调用,但作为我的观察,编译器将删除所有“不必要的”程序集,而不使用EntityFramework.SqlServer东西testing失败。

而不是添加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"); } 

这将使构build过程包含与主机项目的组装。

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

这些都没有为我工作。 我find了另一个stackoverflow问题的解决scheme。 我将在这里添加它以便于参考:

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

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

添加这个function

 private void FixEfProviderServicesProblem() 

到库类中的数据库上下文类,并将缺less的DLL EntityFramework.SqlServer.dll复制到正确的位置。

 namespace abc { 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; } } } 

在使用Entity Framework 6和SQL Server Compact 4.0的时候,我得到了同样的错误。 有关EF6 Entity Framework Providers的 MSDN文章很有帮助。 在包pipe理器控制台中将各自的提供程序命令作为nuget包运行,可能会解决问题,因为NuGet包也会自动将注册添加到configuration文件中。 我运行PM> Install-Package EntityFramework.SqlServerCompact来解决问题。

在testing项目中发生错误时,最漂亮的解决scheme是用以下方法修饰testing类:

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

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

我一直在EF5上使用这个设置一段时间,而不需要在Integration Test Project中包含对EF的引用。

现在,在升级到EF6之后,似乎我也需要在集成testing项目中包含对EF6的引用,尽pipe它在那里没有被使用(正如user3004275所指出的那样 )。

适应症你面临着同样的问题:

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

第三点是什么把我扔了一会儿,我还不知道为什么这是必需的。 在我的集成testing项目中添加一个ref到EF6解决了它在任何情况下…

我今天遇到这个问题。 我有EF63 NuGet包和控制台应用程序进行testing的数据存储库类库,它只参考类库项目。 我创build了非常简单的构build后命令,将EntityFramework.SqlServer.dll从类库Bin \ Debug文件夹复制到控制台应用程序的Bin \ Debug文件夹,并解决了问题。 不要忘记添加entityFramework节到控制台应用程序的.config文件。

添加到你的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> 

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

我认为这个问题会得到解决。

您应该强制对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); } 

我尝试了几乎所有以上,没有任何工作。

只有当我在Default Project EntityFrameworkEntityFramework.SqlServer属性中将引用的DLL设置为Copy Local才能开始工作!

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

删除BIN文件夹为我做了

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

我有同样的问题,只是从包含DBContext项目的应用程序configuration文件复制到我的testing项目

我有抛出相同的exception。 包括我

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

一切又回到了工作

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

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

合乎逻辑的方式就是将enitiess属性移除并用Fluent API取代它,这是真正的解决scheme

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

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

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

  1. 右键点击解决scheme,然后select“pipe理NuGet软件包解决scheme”选项,NuGet软件包pipe理器窗口将显示出来。
  2. 转到'Installed packages'下面的'Manage'选项。提示:entity framework被添加到类库中,所以你将在'Installed packages'下面有EntityFramework,你会看到'Manage'选项
  3. 点击“pipe理”选项,并检查安装包到项目,其中包含EF模型的类库(在我的情况下,我设置checkbox安装包到控制台的应用程序,它参考了内部EF模型的类库)

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

我希望它有帮助。

在我的情况下,一切工作正常,然后突然停止工作,因为我认为Resharper改变了一些导致问题的变化。 我的项目分为数据层,服务和表示层。 我有我的数据层安装和引用entity framework,但仍然错误没有消失。 卸载并重新安装也没有工作。 最后,我通过将数据层设置为启动项目,进行迁移,更新数据库以及将启动项目更改回我的表示层来解决此问题

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

我在使用部分添加了以下行,错误对我是固定的。

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

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

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

在这里输入图像说明

在这里输入图像说明