通过nuget下载EF6并尝试运行我的项目后,它返回以下错误:
找不到具有不变名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序。确保提供程序已在应用程序配置文件的“entityFramework”部分注册。有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=260882。
https://i.stack.imgur.com/78mKj.png
providers
和 provider
的 EF5,所以考虑删除它吗?
public BaseStorage(): base ("RaptorDB") {}
,BaseStorage() 继承自 EF5 中的 DbContext 一切正常,在 EF6 中还没有。
我刚刚遇到了同样的问题,虽然从 NuGet 包管理器安装的 EntityFramework 似乎没有正确安装在项目中。
我设法通过在 Package Manager Console 上运行以下命令来修复它:
PM> Install-Package EntityFramework
您已将 EF 添加到类库项目中。您还需要将它添加到引用它的项目中(您的控制台应用程序、网站或其他)。
EntityFramework.SqlServer.dll
复制到 bin 目录。添加强引用可能会破坏您的体系结构(如果您构建了多个层,那么您的顶级执行程序集甚至不应该知道 EF)。相反,您可以确保复制 SQL Server 提供程序。参见例如 stackoverflow.com/a/19130718/870604
您无需在控制台应用程序中安装 Entity Framework,只需添加对程序集 EntityFramework.SqlServer.dll 的引用。您可以将此程序集从使用实体框架的类库项目复制到 LIB 文件夹并添加对它的引用。
总之:
类库应用程序:安装实体框架 编写数据层代码 app.config 文件包含与实体框架相关的所有配置,但连接字符串除外。
安装实体框架
编写数据层代码
app.config 文件包含与实体框架相关的所有配置,但连接字符串除外。
创建控制台、Web 或桌面应用程序:添加对第一个项目的引用。添加对 EntityFramework.SqlServer.dll 的引用。 app.config/web.config 具有连接字符串(请记住,配置条目的名称必须与 DbContext 类的名称相同。
添加对第一个项目的引用。
添加对 EntityFramework.SqlServer.dll 的引用。
app.config/web.config 具有连接字符串(请记住,配置条目的名称必须与 DbContext 类的名称相同。
我希望它有所帮助。
如果您忘记包含“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
安装 Entity Framework 6 时。 EntityFramework.SqlServer 有时会错过另一个可执行文件。只需将 Nuget
包添加到该项目。
有时以上不适用于测试项目
要在测试项目中解决这个问题,只需将此方法放在测试项目中:
public void FixEfProviderServicesProblem()
{
var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
}
从未调用过此方法,但根据我的观察,编译器将删除所有“不必要的”程序集,并且在不使用 EntityFramework.SqlServer
的情况下测试失败。
EntityFramework.SqlServer
已添加到您的类库中,但如果不使用,它将不会放在应用程序的输出文件夹中。我通过添加 ExecutionStrategy
解决了这个问题,我仍然需要这样做,因此在 DbConfiguration
类中添加类似 SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());
的行解决了这个问题。
添加此功能
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;
}
}
}
.
FixEfProviderServicesProblem
我在构造函数中尝试过,但没有运气。
这些都不适合我。我确实在 another stackoverflow question 中找到了解决方案。我将在此处添加以方便参考:
您需要进行引用,因此它将被复制到 den 应用程序路径中。因为后面会在运行时引用。所以你不需要复制任何文件。
private volatile Type _dependency;
public MyClass()
{
_dependency = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
}
引用正在使用 Entity Framework 的项目的启动项目需要在其 bin 文件夹中包含以下两个程序集:
实体框架.dll
EntityFramework.SqlServer.dll
将 <section>
添加到启动项目的 .config 文件的 <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\
在将 Entity Framework 6 与 SQL Server Compact 4.0 一起使用时,我遇到了同样的错误。 EF6 的 Entity Framework Providers 的 MSDN 文章很有帮助。在包管理器控制台上将相应的提供程序命令作为 nuget 包运行可能会解决问题,因为 NuGet 包也会自动将注册添加到配置文件中。我运行 PM> Install-Package EntityFramework.SqlServerCompact
来解决问题。
当测试项目中发生错误时,最漂亮的解决方案是用以下方式装饰测试类:
[DeploymentItem("EntityFramework.SqlServer.dll")]
今天在使用一组 Web 服务时遇到了这个问题,每个服务都在不同的项目中,以及一个包含对其中一些服务的集成测试的单独项目。
我在 EF5 中使用此设置已有一段时间了,无需在集成测试项目中包含对 EF 的引用。
现在,在升级到 EF6 之后,似乎我也需要在集成测试项目中包含对 EF6 的引用,即使它没有在那里使用(几乎正如上面 user3004275 所指出的那样)。
您面临同样问题的迹象:
直接调用 EF(连接到数据库、获取数据等)工作正常,只要它们是从引用 EF6 的项目启动的。
通过已发布的服务接口调用服务可以正常工作;即服务中没有“内部”缺失的引用。
从服务外的项目直接调用服务项目中的公共方法会导致此错误,即使该项目本身没有使用 EF;仅在被调用项目内部
第三点是什么让我有一段时间,我仍然不确定为什么需要这样做。在我的集成测试项目中添加对 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>
<configSections>
- <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
我今天刚遇到这个问题。我有带有 EF63 NuGet 包和用于测试的控制台应用程序的数据存储库类库,它们仅引用类库项目。我创建了非常简单的构建后命令,它将 EntityFramework.SqlServer.dll 从类库的 Bin\Debug 文件夹复制到控制台应用程序的 Bin\Debug 文件夹并解决了问题。不要忘记将 entityFramework 部分添加到控制台应用程序的 .config 文件中。
我也有类似的问题。通过执行以下操作解决了我的问题:
https://i.stack.imgur.com/6ibKF.png
https://i.stack.imgur.com/YyRro.png
您只是缺少对 EntityFramework.SqlServer.dll 的引用。对于使用 SQL Server 的 EntityFramework 项目,需要参考的两个文件是 EntityFramework.SqlServer.dll 和 EntityFramework.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
只需将 EntityFramework.SqlServer.dll 复制到 bin 文件夹中
我刚刚使用 Nuget 重新安装了实体框架。并按照以下链接上的说明进行操作:http://robsneuron.blogspot.in/2013/11/entity-framework-upgrade-to-6.html
我认为问题会得到解决。
展开 YourModel.edmx 文件并打开 YourModel.Context.tt 下的 YourModel.Context.cs 类。
我在 using 部分添加了以下行,并且为我修复了错误。
使用 SqlProviderServices = System.Data.Entity.SqlServer.SqlProviderServices;
每次自动生成文件时,您可能必须将此行添加到文件中。
我有同样的错误。奇怪的是,只有当我使用 dbContext 查询我的任何模型或获取它的列表时才会发生这种情况:
var results = _dbContext.MyModel.ToList();
我们尝试重新安装实体框架,正确引用它但无济于事。
幸运的是,我们尝试检查 Nuget 的 ALL
解决方案,然后更新所有内容或确保 everything
是相同版本,因为我们注意到这两个项目在 Web 项目上具有不同的 EF 版本。它有效。错误消失了。
这是有关如何为所有解决方案管理 Nuget 的屏幕截图:
https://i.stack.imgur.com/uJYe0.png
只需将 EntityFramework 包安装到您的 Web/控制台项目。这应该将该部分添加到您的配置文件中。
似乎没有人提到首先检查系统中是否安装了 System.Data.SqlClient 以及是否对其进行了引用。
我通过安装 System.Data.SqlClient 并在 app.Config 中添加新提供程序解决了我的问题
<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6"/>
此外,请确保您启动的项目是包含您的 dbcontext(或相关的 app.config)的项目。我正在尝试启动一个没有所有必要配置设置的网站项目。
我几乎尝试了上述所有方法,但没有任何效果。
只有当我将默认项目 EntityFramework
和 EntityFramework.SqlServer
属性 Copy Local
中的引用 DLL 设置为 True
时,它才开始工作!
大家我需要你注意,两个 dll EntityFramework.dll 和 EntityFramework.SqlServer.dll 是 DataAccess 层库,在视图或任何其他层中使用它们是不合逻辑的。它解决了你的问题,但它不合逻辑。
合乎逻辑的方法是实体属性删除并用 Fluent API 替换它们。这是真正的解决方案
我有一个控制台应用程序和类库。在类库中,我创建了实体数据模型(右键单击类库 > 添加 > 新项目 > 数据 > ADO.NET 实体数据模型 6.0)并将引用放在控制台应用程序中。因此,您拥有引用类库的控制台应用程序,并且在类库内部您拥有 EF 模型。当我试图从表中获取一些记录时,我遇到了同样的错误。
我按照以下步骤解决了这个问题:
右键单击解决方案并选择“管理解决方案的 NuGet 包”选项,然后将显示 NuGet 包管理器窗口。转到“已安装包”下的“管理”选项提示:实体框架已添加到类库中,因此您将在“已安装包”下拥有 EntityFramework,您将看到“管理”选项单击“管理”选项并检查安装包到引用包含 EF 模型的类库的项目(在我的情况下,我设置复选框以将包安装到控制台应用程序,该应用程序引用了内部具有 EF 模型的类库)
这就是我所要做的,一切都很完美。
我希望它有所帮助。
我有同样的问题(在我的 3 轮胎级项目中),我通过将 EF 添加/安装到我的主项目来修复它。
从 CE db 迁移到 Azure 上的 Sql Server 时,我遇到了一个相关问题。只是浪费了 4 小时试图解决这个问题。希望这可以挽救一个类似的命运。对我来说,我的 packages.config 文件中有对 SqlCE 的引用。删除它解决了我的整个问题并允许我使用迁移。 Yay Microsoft 为另一种技术提供了不必要的复杂设置和配置问题。
-Pre
选项告诉 nuget 安装预发布包。我不建议使用它。我有类似的错误,但解决方案是在宿主项目中安装 EntityFramework。我已将其安装在类库中,但未安装在主项目(网络/控制台/或其他)中,EntityFramework.SqlServer.dll
添加到 Debug 文件夹 - 问题已解决。