通过nuget下载EF6并尝试运行我的项目后,它返回以下错误:
找不到具有不变名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序。确保提供程序已在应用程序配置文件的“entityFramework”部分注册。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=260882。
通过nuget下载EF6并尝试运行我的项目后,它返回以下错误:
找不到具有不变名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序。确保提供程序已在应用程序配置文件的“entityFramework”部分注册。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=260882。
我刚刚遇到了同样的问题,虽然从 NuGet 包管理器安装的 EntityFramework 似乎没有正确安装在项目中。
我设法通过在包管理器控制台上运行以下命令来修复它:
PM> Install-Package EntityFramework
您已将 EF 添加到类库项目中。您还需要将它添加到引用它的项目中(您的控制台应用程序、网站或其他)。
您无需在控制台应用程序中安装 Entity Framework,只需添加对程序集 EntityFramework.SqlServer.dll 的引用。您可以将此程序集从使用实体框架的类库项目复制到 LIB 文件夹并添加对它的引用。
总之:
我希望它有所帮助。
如果您忘记包含“EntityFramework.SqlServer.dll”,您也可以看到此消息。
它似乎是 EF6 中新添加的文件。最初我没有将它包含在我的合并模块中并遇到了这里列出的问题。
无需将 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/
当您通过Nuget
. EntityFramework.SqlServer 有时会错过另一个可执行文件。只需将Nuget
包添加到该项目。
有时以上不适用于测试项目
要在测试项目中解决这个问题,只需将此方法放在测试项目中:
public void FixEfProviderServicesProblem()
{
var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
}
从未调用过此方法,但根据我的观察,编译器将删除所有“不必要的”程序集,并且不使用EntityFramework.SqlServer
测试失败的东西。
添加此功能
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;
}
}
}
.
这些都不适合我。我确实在另一个 stackoverflow question中找到了解决方案。我将在此处添加以方便参考:
您需要进行引用,因此它将被复制到 den 应用程序路径中。因为后面会在运行时引用。所以你不需要复制任何文件。
private volatile Type _dependency;
public MyClass()
{
_dependency = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
}
在将 Entity Framework 6 与 SQL Server Compact 4.0 一起使用时,我遇到了同样的错误。MSDN for EF6 Entity Framework Providers上的文章很有帮助。在包管理器控制台上将相应的提供程序命令作为 nuget 包运行可能会解决问题,因为 NuGet 包也会自动将注册添加到配置文件中。我跑去PM> Install-Package EntityFramework.SqlServerCompact
解决问题。
引用正在使用 Entity Framework 的项目的启动项目需要在其 bin 文件夹中包含以下两个程序集:
在启动项目的 .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\
当测试项目中发生错误时,最漂亮的解决方案是用以下方式装饰测试类:
[DeploymentItem("EntityFramework.SqlServer.dll")]
今天在使用一组 Web 服务时遇到了这个问题,每个服务都在不同的项目中,并且在一个单独的项目中包含对其中一些服务的集成测试。
我在 EF5 中使用此设置已有一段时间了,无需包含来自集成测试项目的对 EF 的引用。
现在,在升级到 EF6 之后,似乎我也需要在集成测试项目中包含对 EF6 的引用,即使它没有在那里使用(就像上面user3004275指出的那样)。
您面临同样问题的迹象:
第三点是什么让我有一段时间,我仍然不确定为什么需要这样做。在我的集成测试项目中添加对 EF6 的引用无论如何都解决了它......
将以下内容添加到您的 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>
我今天刚遇到这个问题。我有带有 EF63 NuGet 包和用于测试的控制台应用程序的数据存储库类库,它们仅引用类库项目。我创建了非常简单的构建后命令,它将 EntityFramework.SqlServer.dll 从类库的 Bin\Debug 文件夹复制到控制台应用程序的 Bin\Debug 文件夹并解决了问题。不要忘记将 entityFramework 部分添加到控制台应用程序的 .config 文件中。
您只是缺少对 EntityFramework.SqlServer.dll 的引用。对于使用 SQL Server 的 EntityFramework 项目,需要参考的两个文件是 EntityFramework.SqlServer.dll 和 EntityFramework.dll
删除 BIN 文件夹为我做了
只需将 EntityFramework.SqlServer.dll 复制到 bin 文件夹中
您应该强制对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);
}
我刚刚使用 Nuget 重新安装了实体框架。并按照以下链接上的说明进行操作: http ://robsneuron.blogspot.in/2013/11/entity-framework-upgrade-to-6.html
我认为问题会得到解决。
似乎没有人提到首先检查系统中是否安装了 System.Data.SqlClient 以及是否对其进行了引用。
我通过安装 System.Data.SqlClient 并在 app.Config 中添加新提供程序解决了我的问题
<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6"/>
只需将 EntityFramework 包安装到您的 Web/控制台项目。这应该将该部分添加到您的配置文件中。
展开 YourModel.edmx 文件并打开 YourModel.Context.tt 下的 YourModel.Context.cs 类。
我在 using 部分添加了以下行,并且为我修复了错误。
使用 SqlProviderServices = System.Data.Entity.SqlServer.SqlProviderServices;
每次自动生成文件时,您可能必须将此行添加到文件中。
此外,请确保您启动的项目是包含您的 dbcontext(或相关的 app.config)的项目。我正在尝试启动一个没有所有必要配置设置的网站项目。
我几乎尝试了上述所有方法,但没有任何效果。
只有当我在默认项目EntityFramework
和EntityFramework.SqlServer
属性Copy Local
中设置引用的 DLLTrue
时它才开始工作!
大家我需要你注意,两个 dll EntityFramework.dll 和 EntityFramework.SqlServer.dll 是 DataAccess 层库,在视图或任何其他层中使用它们是不合逻辑的。它解决了你的问题,但它不合逻辑。
合乎逻辑的方法是实体属性删除并用 Fluent API 替换它们。这是真正的解决方案
我有同样的问题(在我的 3 轮胎级项目中),我通过将 EF 添加/安装到我的主项目来修复它。
我有一个控制台应用程序和类库。在类库中,我创建了实体数据模型(右键单击类库 > 添加 > 新项目 > 数据 > ADO.NET 实体数据模型 6.0)并将引用放在控制台应用程序中。因此,您拥有引用类库的控制台应用程序,并且在类库内部您拥有 EF 模型。当我试图从表中获取一些记录时,我遇到了同样的错误。
我按照以下步骤解决了这个问题:
这就是我所要做的,一切都很完美。
我希望它有所帮助。
从 CE db 迁移到 Azure 上的 Sql Server 时,我遇到了一个相关问题。只是浪费了 4 小时试图解决这个问题。希望这可以挽救一个类似的命运。对我来说,我的 packages.config 文件中有对 SqlCE 的引用。删除它解决了我的整个问题并允许我使用迁移。Yay Microsoft 为另一种技术提供了不必要的复杂设置和配置问题。
我抛出了相同的异常。包括我
using System.Data;
using System.Data.Entity;
一切都恢复了工作..
我遇到了同样的问题,只是将包含 DBContext 的项目中的 App Config 文件复制到我的测试项目中
就我而言,一切正常,然后突然停止工作,因为我认为 Resharper 更改了一些导致问题的更改。我的项目分为数据层、服务层和表示层。我在我的数据层中安装并引用了实体框架,但错误仍然没有消失。卸载和重新安装也没有用。最后,我通过将数据层设为 Startup 项目、进行迁移、更新数据库并将 Startup 项目改回我的表示层来解决它。
注意:我在从模型生成数据库 Sql 时遇到了这个问题。它已经很好地创建了所有表,但不会导出更改。您需要注意的是,当您尝试使用 DDL 生成模板将 sql 导出为 SSDLtoSQL10 时,会产生此错误。这里需要 MySQL 连接,因此请确保从模型属性的下拉 DDL 生成模板 SSDLtoMySQL 中进行选择。花了一整天的时间!
如消息所示,我们需要添加提供者 System.Data.SqlClient 这就是为什么我们需要安装具有两个 dll 的 EntityFramework 的 nuget 包,但如果我们只开发控制台应用程序,那么我们只需要添加 EntityFramework.SqlServer.dll 的引用