通过nuget下载EF6并尝试运行我的项目后,它会返回以下错误:
没有为ADO.NET提供程序找到具有不变名称“System.Data.SqlClient”的实体框架提供程序。确保提供程序已在应用程序配置文件的“entityFramework”部分中注册。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=260882。
答案 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文件夹并添加对它的引用。
总结:
我希望它有所帮助。
答案 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>
您遇到同样问题的迹象:
第三点是什么让我离开了一段时间,我仍然不确定为什么这是必需的。在我的Integration Test项目中添加ref到EF6解决了它...
答案 11 :(得分:4)
我今天遇到了这个问题。我有数据存储库类库,包含用于测试的EF63 NuGet包和控制台应用程序,它们仅参考类库项目。我创建了非常简单的post-build命令,它将EntityFramework.SqlServer.dll从类库的Bin \ Debug文件夹复制到控制台应用程序的Bin \ Debug文件夹,问题解决了。不要忘记将entityFramework部分添加到控制台应用程序的.config文件中。
答案 12 :(得分:4)
引用正在使用Entity Framework的项目的启动项目需要在bin文件夹中包含以下两个程序集:
在启动项目的.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 程序集进行静态引用,但不是放置虚拟代码,而是以更漂亮的方式执行此操作:
如果您已有 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);
}
答案 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)
答案 18 :(得分:1)
我有同样的错误。奇怪的是,每当我使用dbContext查询我的任何模型或获取其列表时,它才会发生:
var results = _dbContext.MyModel.ToList();
我们尝试重新安装实体框架,正确引用它但无济于事。
幸运的是,我们尝试检查Nuget的ALL
解决方案,然后更新所有内容或确保everything
是相同的版本,因为我们注意到这两个项目在Web项目上有不同的EF版本。它有效。错误消失了。
以下是有关如何为所有解决方案管理Nuget的屏幕截图:
答案 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模型。当我试图从表中获取一些记录时,我遇到了同样的错误。
我按照以下步骤解决了这个问题:
这就是我必须做的一切,一切都很完美。
我希望它有所帮助。
答案 21 :(得分:1)
每个人我都需要你注意两个dll EntityFramework.dll和EntityFramework.SqlServer.dll是DataAccess图层在视图或任何其他图层中使用它们是不逻辑的。它解决了你的问题,但它不符合逻辑。< / p>
逻辑方式是enitiess属性删除并用Fluent API替换它们。这是真正的解决方案
答案 22 :(得分:1)
我几乎尝试了以上所有内容,但没有任何效果。
只有当我将默认项目EntityFramework
和EntityFramework.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的项目复制到我的测试项目