没有为ADO找到实体框架提供程序。NET提供程序,使用不变名称'

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

没有为ADO找到实体框架提供程序。NET提供程序,使用不变名称'System.Data.SqlClient'。确保提供者在应用程序配置文件的“entityFramework”部分中注册。有关更多信息,请参阅http://go.microsoft.com/fwlink/?LinkId=260882

enter image description here

440543 次浏览

我刚刚遇到了同样的问题,它看起来像EntityFramework,虽然从NuGet包管理器安装没有正确安装在项目中。

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

PM> Install-Package EntityFramework

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

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

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

在Azure上从CE db迁移到Sql Server时,我遇到了一个相关的问题。浪费了4个小时来解决这个问题。希望这能挽救一些有类似命运的人。对我来说,我的包中有一个对SqlCE的引用。配置文件。删除它解决了我的整个问题,并允许我使用迁移。太棒了,微软又推出了一项存在不必要的复杂设置和配置问题的技术。

删除bin文件夹帮我解决了这个问题

今天在处理一组web服务时遇到了这个问题,每个web服务都在不同的项目中,而一个单独的项目包含其中一些服务的集成测试。

我已经在EF5中使用这个设置有一段时间了,不需要包括集成测试项目中对EF的引用。

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

说明你也面临着同样的问题:

  • 直接调用EF(连接到DB,获取数据等)工作正常,只要它们是从引用EF6的项目发起的。
  • 调用服务通过发布的服务接口工作正常;也就是说,在服务中“内部”不存在缺失引用。
  • 在服务项目中,从服务外部的项目中调用直接到公共方法将导致此错误,即使EF没有在该项目中使用;仅在被调用的项目内部

第三点是让我困惑了一段时间,我仍然不确定为什么需要这个。在我的集成测试项目中添加ref到EF6,在任何情况下都解决了这个问题…

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

你不需要在控制台应用程序中安装实体框架,你只需要添加一个对程序集EntityFramework.SqlServer.dll的引用。您可以将此程序集从使用实体框架的类库项目复制到LIB文件夹,并向其添加引用。

总而言之:

  • 类库应用程序:
    • 安装实体框架
    • 编写数据层代码
    • app.config文件包含了除了连接字符串之外与实体框架相关的所有配置。
    • 李< / ul > < / >
    • 创建控制台、web或桌面应用程序:
      • 向第一个项目添加引用。
      • 添加一个对EntityFramework.SqlServer.dll的引用。
      • app.config /网络。config有连接字符串(记住,配置项的名称必须与DbContext类的名称相同。
      • 李< / ul > < / >

      我希望这能有所帮助。

这些对我都没用。我确实在另一个stackoverflow问题中找到了解决方案。我将在这里添加它以方便参考:

你需要做一个参考,所以它将被复制到den应用程序 路径。因为稍后它将在运行时被引用。所以你不需要 需要复制任何文件
private volatile Type _dependency;


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

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

有时以上对测试项目不起作用

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

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

这个方法从未被调用过,但根据我的观察,编译器将删除所有“不必要的”程序集,并且不使用EntityFramework.SqlServer东西,测试失败。

我得到了同样的错误,而使用实体框架6与SQL Server紧凑4.0。MSDN上实体框架提供者 for EF6的文章很有帮助。在包管理器控制台以nuget包的形式运行相应的提供程序命令可能会解决这个问题,因为nuget包也会自动向配置文件添加注册。我运行PM> Install-Package EntityFramework.SqlServerCompact来解决这个问题。

我刚刚使用Nuget重新安装了实体框架。 按照下面链接上的说明操作: # EYZ0 < / p >

我想问题会解决的。

我有同样的问题,只是复制了应用程序配置文件从包含DBContext的项目到我的测试项目

我抛出了相同的异常。我包括

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

一切都恢复正常了。

我今天才遇到这个问题。我有数据存储库类库与EF63 NuGet包和控制台应用程序进行测试,其中只引用类库项目。我创建了一个非常简单的构建后命令,它将EntityFramework.SqlServer.dll从类库的Bin\Debug文件夹复制到控制台应用程序的Bin\Debug文件夹,问题就解决了。不要忘记将entityFramework部分添加到控制台应用程序的.config文件中。

而不是添加EntityFramework。您可以确保从模型/实体项目中对它进行静态引用,如下所示

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");
}

这将使构建过程将程序集与主机项目包括在一起。

更多信息在我的博客上 # EYZ0 < / p >

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

当错误发生在测试项目时,最漂亮的解决方案是用以下方式装饰测试类:

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

将以下内容添加到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>

添加这个函数

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;
}
}
}

我几乎尝试了以上所有方法,但都没有奏效。

只有当我在默认项目EntityFrameworkEntityFramework.SqlServer属性Copy LocalTrue中设置引用的dll时,它才开始工作!

大家注意,两个dll EntityFramework.dll和EntityFramework.SqlServer.dll是DataAccess层库,在视图或任何其他层中使用它们是不符合逻辑的。它能解决你的问题,但不符合逻辑。

逻辑的方法是删除实体属性并用Fluent API替换它们。这是实解

注意:我在从模型生成数据库Sql时遇到了这个问题。它已经创建了所有的表,但是不能导出更改。您需要注意的是,当您尝试使用DDL生成模板将sql导出为SSDLtoSQL10时,会生成此错误。它期待MySQL连接在这里,所以确保你选择从下拉DDL生成模板SSDLtoMySQL的模型属性。花了一整天的时间!

我有一个控制台应用程序和类库。在类库中,我创建了实体数据模型(右键单击类库>添加>新项目>数据> ADO。NET实体数据模型6.0),并在控制台应用程序中放置引用。因此,你有控制台应用程序,它引用类库,在类库中,你有EF模型。当我试图从表中获取一些记录时,我遇到了同样的错误。

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

  1. 右键单击解决方案,选择选项“管理解决方案的NuGet包”,NuGet包管理器窗口将显示。
  2. 转到“已安装包”下的“管理”选项 提示:实体框架被添加到类库中,所以你会在'Installed packages'下有EntityFramework,你会看到'Manage'选项
  3. 点击“管理”选项,并检查安装包到项目,该项目引用了持有EF模型的类库(在我的情况下,我设置了复选框,将包安装到控制台应用程序,其中引用了类库,其中有EF模型)

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

我希望这对你有所帮助。

你应该强制对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. If you don't have a DbConfiguration class you must put the following code at app startup (before EF is used):

    static MyContext()
    {
    DbConfiguration.Loaded += (sender, e) =>
    e.ReplaceService<DbProviderServices>((s, k) => System.Data.Entity.SqlServer.SqlProviderServices.Instance);
    }
    

在我的情况下,一切都正常工作,然后突然停止工作,因为我认为Resharper改变了一些变化,导致问题。我的项目分为数据层、服务层和表示层。我有实体框架安装和引用在我的数据层,但错误仍然没有消失。卸载和重装也不起作用。最后,我用将数据层作为启动项目,进行迁移,更新数据库,并将启动项目更改回表示层解决了它。

YourModel扩张。然后打开YourModel.Context.tt下的YourModel.Context.cs类。

我在使用部分添加了以下一行,错误为我修复了。

using SqlProviderServices = System.Data.Entity.SqlServer.SqlProviderServices;

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

我也遇到过类似的问题。我的问题是通过以下方法解决的:

enter image description here

enter image description here

我有同样的错误。奇怪的是,它只发生在我使用dbContext查询我的任何模型或获得它的列表时:

var results = _dbContext.MyModel.ToList();

我们试图重新安装实体框架,正确引用它,但无济于事。

幸运的是,我们尝试检查Nuget中的ALL解决方案,然后更新所有内容或确保everything是相同的版本,因为我们注意到两个项目在Web项目中有不同的EF版本。这很有效。错误消失了。

以下是关于如何管理所有解决方案的Nuget的截图:

enter image description here

只需安装EntityFramework包到您的Web/控制台项目。这应该会将该节添加到配置文件中。

引用实体框架所在项目的启动项目需要在bin文件夹中包含以下两个程序集:

  • EntityFramework.dll
  • EntityFramework.SqlServer.dll

在启动项目上的.config文件的<section>中添加<section>将使第一个程序集在该bin目录中可用。你可以从实体框架项目的.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>
要使第二个.dll在bin文件夹中可用,尽管不实际,但可以从实体框架项目的bin文件夹中手动复制。 一个更好的选择是向实体框架项目的Post-Build Events添加以下行,这将使该过程自动化
cd $(ProjectDir)
xcopy /y bin\Debug\EntityFramework.SqlServer.dll ..\{PATH_TO_THE_PROJECT_THAT_NEEDS_THE_DLL}\bin\Debug\

您只是缺少了对EntityFramework.SqlServer.dll的引用。对于使用SQL Server的EntityFramework项目,需要引用的两个文件是EntityFramework. sqlserver .dll和EntityFramework.dll

似乎没有人提到首先检查system . data . sqlclient是否安装在系统中,以及是否引用了它。

我通过安装System.Data.SqlClient并在app.Config中添加一个新的提供者来解决我的问题

<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6"/>

复制EntityFramework.SqlServer.dll 进入bin文件夹

我也有同样的问题(在我的3轮胎水平项目),我通过添加/安装EF到我的主项目来修复它。