未找到具有不变名称'System.Data.SqlClient'的ADO.NET提供程序的实体框架提供程序


542

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

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

在此处输入图片说明


我使用没有providersprovider东西的EF5 ,因此考虑删除它吗?
ta.speot。是

1
在此处
放置

连接字符串在picture(App.confing)中,很简单,我将其称为构造函数public BaseStorage(): base ("RaptorDB") {},BaseStorage()从EF5中的DbContext继承而来,一切正常,而在EF6中则没有。
费尔南多·韦洛佐

10
通过安装第二个项目EF6(控制台),将解决问题,这要归功于以任何方式提供帮助的每个人!
费尔南多·韦洛佐

3
对我来说,这似乎是因为Visual Studio没有意识到EntityFramework.SqlServer程序集实际上已由基础项目使用。如果您执行@Carra的答案之类的操作,则不必将 EF添加到引用基础项目的每个项目中-更加简洁。
tehDorf '16

Answers:


608

我只是遇到了同样的问题,尽管从NuGet程序包管理器安装的项目没有正确安装,但看起来却像EntityFramework。

我设法通过在Package Manager Console上运行以下命令来修复它:

PM> Install-Package EntityFramework

34
PMC写道“ EntityFramework 6.0.1”已经安装,但将其添加到我的控制台应用程序中(该应用程序实际上未使用EF),但它也为我完成了窍门。II从控制台应用程序引用中删除EF,错误返回,我不明白-我的控制台应用程序正在使用存储库项目(使用EF)感谢您的帮助!
Prokurors 2013年

33
如果您的解决方案中有多个项目,请不要忘记在命令行中添加-ProjectName <ProjectName>。
EugenioMiró13年

1
使用-Pre选项告诉nuget安装预发行版软件包。我不建议使用它。我有一个类似的错误,但是解决方案是仅在宿主项目中安装EntityFramework。我已将其安装在类库中,但未安装在主项目中(Web /控制台/或其他任何项目),
Davide Icardi

10
这里同样的问题。我有一个项目,该项目没有对EF的引用,但EF dll在Debug文件夹中。对添加EntityFramework.SqlServer.dll到Debug文件夹中的该项目运行此命令-已解决问题。
qujck

4
在我的情况下,直到将项目部署到我们的测试服务器上之后,该错误才会出现。确实是缺少EntityFramework.SqlServer.dll并通过程序包管理器安装EF起作用了。它只是将两个相关的引用添加到项目中,然后将EntityFramework设置添加到web.config中。我想本地IIS可以在本地提供程序集,但是由于权限的原因,Web服务器上的完整IIS不能?
2015年

383

您已将EF添加到类库项目中。您还需要将其添加到引用它的项目中(您的控制台应用程序,网站或其他内容)。


246
这是绝对荒谬的答案。为什么我到底需要这样做?你知道什么更荒谬吗?有用。
罗伯特

19
请在下面查看我的答案,您无需在控制台应用程序中安装EF。
Francisco Goldenstein 2014年

7
您的回答是正确的。仅将引用EntityFramework.SqlServer.dll添加到使用带有EF库的前端项目,即可解决此问题。因此,请勿使用此EF(仅DLL)
harveyt 2014年

31
你不具有参考在控制台/ web应用程序添加到EF。您只需要确保EntityFramework.SqlServer.dll将其复制到bin目录即可。添加强引用可能会破坏您的体系结构(如果您构建了多层,则顶级执行程序集甚至都不应该知道EF)。相反,您可以确保复制SQL Server提供程序。参见示例stackoverflow.com/a/19130718/870604
ken2k

3
我怀疑未将EntityFramework.SqlServer.dll检测为依赖项的原因是因为Entity Framework动态加载了它。当唯一引用在配置文件中时,您的项目应该如何知道通过SQL提供程序进行复制?
Joel McBeth 2015年

209

您无需在控制台应用程序中安装Entity Framework,只需添加对程序集EntityFramework.SqlServer.dll的引用。您可以将该程序集从使用实体框架的类库项目复制到LIB文件夹,并添加对它的引用。

综上所述:

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

希望对您有所帮助。


18
正确答案。无需安装EF。EntityFramework.SqlServer.dll。
汤姆·斯蒂克2014年

15
我必须同意。这是完全正确的答案。引用一个1/2 mb的dll或拉出大于5.5 mb的EF nuget项目。也降低了构建多层架构的价值。MS的节目表现很差:我有4个等级,而我的最上层应该真的没有理由对EF有任何了解
72GM 2015年

18
无论如何还是很可笑的。例如,为什么前端需要引用SqlServer?就我而言,前端不在乎。但这有效。+1
Mike de Klerk

2
这很有帮助。非常感谢。
peter_the_oak

1
这样会不会很难更新EntityFramework的版本?您必须记住要去更新对DLL的引用
暗恋

114

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

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


7
当我以前有一个项目(a)引用一个项目(b)引用了EF时,我遇到了这个问题。清理并删除项目(a)bin文件夹,然后重新构建之后,遇到了EF参考,但没有EF.SqlServer.dll。以手动方式复制此文件对我
有用

2
@dan richardson感谢您提及“删除bin文件夹”。
Rajshekar Reddy 2013年

在EF6升级后尝试运行LINQPad脚本时出现错误。即使我在LINQPad中引用EntityFramework.SqlServer.dll也无法修复它,直到我在VS2013中重建了我的解决方案。然后,新引用在LINQPad中正确解析,并且我的脚本运行了!
克里斯

就我而言,我对开发环境还可以,但是当我发表时却出现了所提到的问题。在将dev中的库列表与服务器中的bin文件夹进行比较后,我注意到EntityFramework.SqlServer.dll缺失了,我只是上传它并刷新应用程序,并确定将其修复。
亨利·罗德里格斯

这是我的问题,谢谢!请参阅@Anders提供的全新解决方案,以避免忘记将DLL包含在每个必需项目中的问题。
SharpC

54

无需将EntityFramework.SqlServer添加到宿主项目,您可以确保从Model / entity项目像这样对它进行静态引用

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
我认为这是一个很好的干净解决方案,在其中我们不必在与持久性无关的项目中包含与持久性相关的DLL的引用。
JTech

3
同意,它适用于所有具有隐式依赖关系的库,而不仅仅是持久性
Anders

3
当您对程序集中的类型有显式依赖时,它将由构建过程复制。但是,在这里您没有显式的依赖关系,并且构建过程将无法将程序集复制到build文件夹。我的代码只是确保在所述程序集中存在对任何类型的显式引用。
Anders

2
没有它,就没有明确的相关性,从你的代码的程序集,它不会被复制到输出
安德斯


48

通过安装Entity Framework 6时Nuget。EntityFramework.SqlServer有时会丢失另一个可执行文件。只需将Nuget包添加到该项目。

有时以上不适用于测试项目

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

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

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


2
好吧,这不是很漂亮,但是它解决了我在测试项目中遇到的问题。其他解决方案均无效。
周星驰

在我的情况下,它足以也加入实体框架,以我的测试项目中的“管理的解决方案的NuGet包”
尤哈Palomäki

实际上,您需要放入任何项目(不仅用于测试),以确保在编译后将System.Data.Entity.SqlServer包含在“ results lib set”中(注意:Unity或其他IoC工具可能会更改此规则,您将需要从测试项目中调用此代码)。
Roman Pokrovskij

这实际上是最好的解决方案,因为您不必在项目中的任何地方喷涂实体框架引用。
丹尼尔·罗伯

这为我指明了正确的方向。会EntityFramework.SqlServer被添加到您的类库中,但如果不使用它,则不会将其放置在应用程序的输出文件夹中。我通过添加ExecutionStrategy仍然要解决的问题来解决该问题,因此SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());DbConfiguration类中添加一行就解决了该问题。
Jan_V

24

添加此功能

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


很抱歉,尝试撤销它……因为我认为它不会起作用……而且确实如此!……它说我无法更改我的投票,除非对答案进行了编辑,因为它太久了,自那以后锁定...
Seabizkit

这也对我有用。我们有一个使用EF 6的库项目,以及一个使用该库的控制台应用程序。我们遇到了与OP相同的例外。我们不希望将特定于EntityFramework的配置放在应用程序配置文件中,因此该方法对我们有用。谢谢
Rob

1
你在哪里叫FixEfProviderServicesProblem我在构造函数中尝试过,没有运气。
弗朗西斯·杜沙姆

1
我从不叫它-不必。存在的事实使.net认为它是必需的,并包括EntityFramwork作为依赖项。
约翰内斯

可能来自stackoverflow.com/a/19130718/1467396?但是无论如何+1都是为了清楚如何使用它。
戴维

20

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

您需要进行参考,因此将其复制到应用程序路径中。因为稍后它将在运行时中引用。因此,您无需复制任何文件。

private volatile Type _dependency;

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

2
这个!无需添加对可能引用此程序集的其他项目的引用。
tehDorf '16

8

将Entity Framework 6与SQL Server Compact 4.0一起使用时,出现了相同的错误。有关EF6 实体框架提供程序的 MSDN的文章很有帮助。在软件包管理器控制台上将相应的提供程序命令作为nuget软件包运行可能会解决该问题,因为NuGet软件包也会自动将注册添加到配置文件中。我跑来PM> Install-Package EntityFramework.SqlServerCompact解决问题。


2
我真的很惊讶,到目前为止,没有人为此投票!错误消息清楚地表明:错误的原因是在EF升级后,应用程序的web.config文件中实际上没有为SQL Compact提供的提供程序定义!添加您提到的软件包可修复web.config文件,并且将定义提供程序。
卡萨托·托斯

1
简直就是救命稻草。应该将其标记为答案,因为它清楚地提供了解决问题的方法
ZafarYousafi 2014年

7

今天,在使用一组Web服务(每个项目都在不同的项目)和一个单独的项目(其中包含其中一些服务的集成测试)时,会遇到这个问题。

我在EF5上使用该设置已有一段时间,而无需包含来自Integration Test Project的对EF的引用。

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

指示您面临相同的问题:

  • 只要是从引用了EF6的项目中启动,直接调用EF(连接到数据库,获取数据等)就可以正常工作。
  • 通过已发布的服务接口调用服务可以正常工作;即服务中没有“内部”缺少的引用。
  • 从服务外部的项目直接调用服务项目中的公共方法将导致此错误,即使该项目本身未使用EF也是如此。仅在被调用项目内部

第三点是让我离开一会儿的原因,但我仍然不确定为什么要这样做。无论如何,在我的Integration Test项目中向EF6添加一个引用都可以解决它...


7

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

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

它确实很不错,但是会产生更多的工作并且更容易忘记。使用“强制引用”技巧,您只需要在确实需要使用EF的项目上进行操作即可。
Charles Roberto Canato

7

引用正在使用Entity Framework的项目的启动项目在其bin文件夹中需要以下两个程序集:

  • EntityFramework.dll
  • EntityFramework.SqlServer.dll

在启动项目上的.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>

为了使第二个.dll在bin文件夹中可用,尽管不切实际,但可以从Entity Framework项目的bin文件夹中进行手动复制。更好的选择是将以下行添加到Entity Framework项目的“构建后事件”中,这将使过程自动化:

cd $(ProjectDir)
xcopy /y bin\Debug\EntityFramework.SqlServer.dll ..\{PATH_TO_THE_PROJECT_THAT_NEEDS_THE_DLL}\bin\Debug\

2
谢谢,我在数据层中有实体框架,因此它是隔离的,但是不幸的是,Microsoft不允许我们真正隔离数据层,并使我们使用数据库技术污染了ux。我希望我不必那样做。
马特

4

我今天刚遇到这个问题。我有带有EF63 NuGet包的数据存储库类库和用于测试的控制台应用程序,它们仅参考类库项目。我创建了一个非常简单的生成后命令,该命令将EntityFramework.SqlServer.dll从类库的Bin \ Debug文件夹复制到控制台应用程序的Bin \ Debug文件夹,并解决了问题。不要忘记将entityFramework部分添加到控制台应用程序的.config文件。


4

将以下内容添加到您的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" />
TryingToImprove

这就是“ IInstall-Package EntityFramework”的作用。这实际上不是必需的,因为EntityFramework默认情况下会尝试为SqlClient不变名称加载EntityFramework.SqlServer.dll。此方法可用于替代提供程序。
user1295211


3

您应该强制对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. 如果没有DbConfiguration类,则必须在应用程序启动时放置以下代码(在使用EF之前):

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


2

展开YourModel.edmx文件,然后在YourModel.Context.tt下打开YourModel.Context.cs类。

我在使用部分添加了以下行,并且该错误已为我修复。

使用SqlProviderServices = System.Data.Entity.SqlServer.SqlProviderServices;

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



2

似乎没有人提到先检查System.Data.SqlClient是否已安装在系统中以及是否对其进行了引用。

我通过安装System.Data.SqlClient并在app.Config中添加新的提供程序解决了我的问题

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

1

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


1

我几乎尝试了以上所有方法,但没有任何效果。

只有当我在默认设置项目所引用的DLL EntityFrameworkEntityFramework.SqlServer性能Copy Local,以True什么时候开始工作!


1

每个人都需要您的注意,两个DLL EntityFramework.dll和EntityFramework.SqlServer.dll是DataAccess层库,在视图或任何其他层中使用它们不是逻辑上的。它可以解决您的问题,但不合逻辑。

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


1

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

我按照以下步骤解决了这个问题:

  1. 右键单击解决方案,然后选择选项“管理解决方案的NuGet软件包”,将显示NuGet软件包管理器窗口。
  2. 转到“已安装软件包”下的“管理”选项提示:实体框架已添加到类库中,因此您将在“已安装软件包”下具有EntityFramework,并且会看到“管理”选项
  3. 单击“管理”选项,然后检查是否将软件包安装到引用了拥有EF模型的类库的项目(在我的情况下,我设置了复选框以将软件包安装到引用了其中包含EF模型的类库的控制台应用程序)

那就是我要做的所有事情,一切都完美无缺。

希望对您有所帮助。


1

我有同样的错误。奇怪的是,只有在我使用dbContext查询任何模型或获取其列表时才会发生这种情况:

var results = _dbContext.MyModel.ToList();

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

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

这是有关如何为所有解决方案管理Nuget的屏幕截图:

在此处输入图片说明


1

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


0

从CE数据库迁移到Azure上的Sql Server时遇到一个相关问题。只是浪费了4个小时来解决这个问题。希望这可以为某人省下类似的命运。对我来说,我的packages.config文件中有对SqlCE的引用。删除它解决了我的整个问题,并允许我使用迁移。Yay Microsoft适用于另一种技术,该技术具有不必要的设置和配置问题。



0

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

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

然后一切又恢复了工作..


0

如消息所示,我们需要添加提供程序System.Data.SqlClient,这就是为什么我们需要安装具有两个dll的EntityFramework的nuget包的原因,但是如果我们仅开发控制台应用程序,则只需添加EntityFramework.SqlServer.dll的引用

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.