找不到名称为“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程序集的静态引用,而不是放置一个虚拟代码,您可以以更美丽的方式做到这一点:
-
如果你已经有一个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); }
我尝试了几乎所有以上,没有任何工作。
只有当我在Default Project EntityFramework
和EntityFramework.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时,我遇到了同样的错误。
我通过以下步骤解决了这个问题:
- 右键点击解决scheme,然后select“pipe理NuGet软件包解决scheme”选项,NuGet软件包pipe理器窗口将显示出来。
- 转到'Installed packages'下面的'Manage'选项。提示:entity framework被添加到类库中,所以你将在'Installed packages'下面有EntityFramework,你会看到'Manage'选项
- 点击“pipe理”选项,并检查安装包到项目,其中包含EF模型的类库(在我的情况下,我设置checkbox安装包到控制台的应用程序,它参考了内部EF模型的类库)
这就是我所要做的一切,一切都很完美。
我希望它有帮助。
在我的情况下,一切工作正常,然后突然停止工作,因为我认为Resharper改变了一些导致问题的变化。 我的项目分为数据层,服务和表示层。 我有我的数据层安装和引用entity framework,但仍然错误没有消失。 卸载并重新安装也没有工作。 最后,我通过将数据层设置为启动项目,进行迁移,更新数据库以及将启动项目更改回我的表示层来解决此问题 。
展开YourModel.edmx文件并在YourModel.Context.tt下打开YourModel.Context.cs类。
我在使用部分添加了以下行,错误对我是固定的。
使用SqlProviderServices = System.Data.Entity.SqlServer.SqlProviderServices;
每次自动生成文件时,您可能必须将此行添加到文件中。
我也有一个类似的问题。我的问题是通过执行以下操作来解决的:
- 刷新entity framework3.5中的存储过程
- 如何在代码中首先删除下划线中的外键字段
- MySQL – 实体:表“TableDetails”中的列“IsPrimaryKey”的值是DBNull
- LINQ to Entities Exception中不支持指定的types成员“Date”
- Code First – Data Annotations还是Fluent API更好?
- 如何在没有加载内容的情况下在EntityFramework中COUNT行?
- findSQL语句的LINQ语句最简单的方法是什么?
- 最好的方法来检查entity framework中是否存在对象?
- entity framework选项来映射string列表或int列表(List <string>)