实体框架提供程序类型无法加载?


420

我试图在当前安装在计算机上的TeamCity上运行测试。

System.InvalidOperationException

实体框架提供程序类型“ 为” 'ADO.NET提供程序无法加载。确保提供程序程序集可用于正在运行的应用程序。System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServerVersion=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'System.Data.SqlClient

有关更多信息,请参见http://go.microsoft.com/fwlink/?LinkId=260882

System.Data.Entity正如在Codeplex上建议的那样,在我的任何项目中都没有提及升级到EF6的内容。

因此,我不确定为什么会出现此异常。从VS运行测试时,我没有得到任何此类异常。

我确实尝试将CopyLocal设置为false,然后再次设置为true ..但这似乎也不起作用。

更新资料

我的app.config具有以下内容。这会导致某些我不理解的行为吗?

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  </entityFramework>
</configuration>

我在teamcity中获得以下stacktrace。

[MSTest] IntegrationTests.CrudTest+QuestionTest.Create
[03:59:11][IntegrationTests.CrudTest+QuestionTest.Create] Initialization method IntegrationTests.CrudTest+QuestionTest.Initialize threw exception. System.InvalidOperationException: System.InvalidOperationException: The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 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..
[03:59:11]
[IntegrationTests.CrudTest+QuestionTest.Create]     at System.Data.Entity.Config.ProviderServicesFactory.GetInstance(String providerTypeName, String providerInvariantName)
   at System.Data.Entity.Config.ProviderServicesFactory.GetInstanceByConvention(String providerInvariantName)
   at System.Data.Entity.Config.DefaultProviderServicesResolver.GetService(Type type, Object key)
   at System.Data.Entity.Config.CachingDependencyResolver.<>c__DisplayClass1.<GetService>b__0(Tuple`2 k)
   at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
   at System.Data.Entity.Config.CachingDependencyResolver.GetService(Type type, Object key)
   at System.Data.Entity.Config.ResolverChain.<>c__DisplayClass3.<GetService>b__0(IDbDependencyResolver r)
   at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
   at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
   at System.Data.Entity.Config.ResolverChain.GetService(Type type, Object key)
   at System.Data.Entity.Config.RootDependencyResolver.GetService(Type type, Object key)
   at System.Data.Entity.Config.ResolverChain.<>c__DisplayClass3.<GetService>b__0(IDbDependencyResolver r)
   at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
   at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
   at System.Data.Entity.Config.ResolverChain.GetService(Type type, Object key)
   at System.Data.Entity.Config.CompositeResolver`2.GetService(Type type, Object key)
   at System.Data.Entity.Config.IDbDependencyResolverExtensions.GetService[T](IDbDependencyResolver resolver, Object key)
   at System.Data.Entity.Config.InternalConfiguration.GetService[TService](Object key)
   at System.Data.Entity.Config.DbConfiguration.GetService[TService](Object key)
   at System.Data.Entity.Utilities.DbProviderFactoryExtensions.GetProviderServices(DbProviderFactory factory)
   at System.Data.Entity.Infrastructure.DefaultManifestTokenService.GetProviderManifestToken(DbConnection connection)
   at System.Data.Entity.Utilities.DbConnectionExtensions.GetProviderInfo(DbConnection connection, DbProviderManifest& providerManifest)
   at System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection)
   at System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext)
   at System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input)
   at System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
   at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
   at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
   at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext()
   at System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName)
   at System.Data.Entity.Internal.Linq.InternalSet`1.Add(Object entity)
   at System.Data.Entity.DbSet`1.Add(TEntity entity)
   at EFRepository.Infrastructure.EFRepository`1.Add(T item) in c:\TeamCity\buildAgent\work\da2ea4e72c0e77f0\Repository\Infrastructure\EFRepository.cs:line 22
   at IntegrationTests.CrudTest.Initialize() in c:\TeamCity\buildAgent\work\da2ea4e72c0e77f0\IntegrationTests\CrudTest.cs:line 34

1
是否将EntityFramework.SqlServer.dll与EntityFramework.dll一起部署?在EF6中,SqlServer和SqlServerCE提供程序与早期版本的EF引擎不在同一个程序集中。您不应添加对System.Data.Entity.dll的引用。与EF5相比,EF6中的提供程序模型已更改,而EF5提供程序将无法正常工作。此外,您还会遇到一些棘手的问题(例如EF5地理空间类型在EF6中被视为实体类型)
Pawel 2012年

是的,我已经仔细检查了是否没有对System.Data.Entity的引用,并且存在对EntityFramework.dll和EntityFramework.SqlServer.dll的引用。projetc再次在VS中运行编译和测试。只有当我在TeamCity上运行测试时,错误才会出现。
ashutosh raina

这是正确的设置。我没有使用TeamCity,但在我看来,当您部署应用程序以使用TeamCity运行测试时,EntityFramework.SqlServer.dll丢失了,因此是例外。
Pawel 2012年

1
看到这篇文章的答案:stackoverflow.com/questions/21175713/…我添加了private volatile Type _dependency...答案,它起作用了!只是为了使EF在TeamCity中工作而不得不添加这样一个单独的类,这很令人讨厌。
2016年

2
我从nuget软件包中卸载了EntityFramework,然后再次安装,它得到了修复
abhyudayasrinet,2016年

Answers:


426

同样的问题,但是我通过Nuget安装了EF 6。缺少另一个可执行文件的EntityFramework.SqlServer。我只是将nuget包添加到了该项目。


108
我也注意到了这一点。如果创建使用EF的库,VS会将EF.dll和EF.SqlServer.dll放入该生成文件夹。但是,如果您现在有了另一个使用该库的程序,则仅EF.dll会放入此生成文件夹中。EF.SqlServer.dll丢失。如果您手动将其添加到生成文件夹,该程序将起作用。本身并不是一个好的解决方案,但显示出的问题是EF.SQLServer.dll丢失是错误的原因。
埃里克

44
我添加了var x = typeof(System.Data.Entity.SqlServer.SqlProviderServices); 然后我的应用程序工作了
Brian

33
我总是担心,当我键入代码时,绝对不会执行任何操作,而且我的项目突然运行。O_o
乔丹

10
另外,由于编译器优化,您可能还想这样做,x.ToString()否则它将typeof在Release中删除。
乔丹

15
我感到很烦人的是,EF 6.1现在需要在我的ASPX DLL /项目上安装EF,而EF 5.0仅在我的数据层DLL /项目上需要它。
PeterX 2014年

274

我在测试项目中遇到了同样的问题-我通过NuGet安装了最新的EF6位,并且每次我调用与EF相关的东西时,都会得到:

无法加载'System.Data.SqlClient'ADO.NET提供程序的Entity Framework提供程序类型'System.Data.Entity.SqlServer.SqlProviderServices,EntityFramework.SqlServer'。确保提供程序程序集可用于正在运行的应用程序。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkId=260882

解决方法:我将此方法放在测试项目中:

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

从未调用过此方法,但是我认为编译器将删除所有“不必要的”程序集,并且在不使用EntityFramework.SqlServer的情况下,测试将失败。

无论如何:在我的机器上可以工作;)

注意:可以确保从Model / entity项目中静态引用SqlProviderServices,而不是将方法添加到测试项目中


24
我最终做了同样的事情。我想和那个使该程序集依赖于打开与db的连接的人交谈。在他们的备用Universe中,所有带有带有连接字符串的配置文件的前端项目都应引用EntityFramework,只是为了获取此dll来打开连接。我不理解这是什么意思。
juhan_h 2013年

3
这是一个hack,但这是我针对没有为项目创建部署程序包的情况找到的最好/最简单的解决方案。
2013年

3
对于所有使用其他建议的人,例如“ var x = typeof(SqlProviderServices);”。仅Robert提供的此解决方案可用于开发和构建机器!!!
亚历山大·施密特

3
感谢罗伯特,这对于EF团队来说是荒谬的,但无论如何对我来说都是有效的。
Hitesh

7
要清楚:将以上代码添加到您的DbContext类中将解决EF 6.1中的问题。这样,您无需在前端(WebApi等)项目中包括Entity Framework Nuget包,并且可以将与EF相关的所有内容保留在数据层中。
尼克

106

Nuget将配置您的EF6项目以引用EntityFramework.SqlServer.dll。这将在构建期间部署到EF6项目的输出文件夹,但不会部署到引用EF6项目的项目的输出文件夹。我相信这是因为Visual Studio足够“智能”,可以检测到程序集中没有任何东西直接在使用dll,因此不包含它。通过将代码添加到使用EntityFramework.SqlServer.dll的EF6项目中,您可以强制将EntityFramework.SqlServer.dll部署到引用EF6项目的项目的输出文件夹中(单元测试,UI等)。注意不要将代码放在生成的类中,因为在下一次重新生成时可能会丢失代码。我选择将以下类添加到程序集中,从而解决了该问题。

using System.Data.Entity.SqlServer;

internal static class MissingDllHack
{
    // Must reference a type in EntityFramework.SqlServer.dll so that this dll will be
    // included in the output folder of referencing projects without requiring a direct 
    // dependency on Entity Framework. See http://stackoverflow.com/a/22315164/1141360.
    private static SqlProviderServices instance = SqlProviderServices.Instance;
}

1
这为我解决了有关MSTest的问题。我喜欢这种方法,因为它不需要对测试类的类继承做任何麻烦的事情。只需将类包含在测试程序集和MAGIC中即可。谢谢!
kbrimington

恰恰是,这就是它没有将sqlserver.dll复制到引用项目输出的原因。当您在执行应用程序和上下文程序集之间还有一层时,就会发生这种情况。谢谢,这解决了我的问题。
巴拉特

2
对于那些不想花4秒钟查找它的人:using System.Data.Entity.SqlServer;
TTT

我们对单元测试使用通用的基类,所有单元测试均从此类继承。将这个方法添加到一个类中意味着具有从基类继承的单元测试类的所有项目都可以正常工作。
MaxJ 2015年

3
一点,但最好在该类中添加注释以解释为什么有必要。
John Darvill

43

我的解决方案是通过nuget管理器从项目中删除实体框架,然后将其重新添加。


9
PM> Update-Package -Reinstall "EntityFramework" -ProjectName "MyProj1"
VahidN

这为我解决了问题,我认为这可能是最佳解决方案
ccoutinho

简单,干净的解决方案有效。应该在列表上更高
mode777

29

我通过在DBContext类的顶部添加using语句来解决此问题,如下所示:

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

1
这是解决此问题的最干净的方法。谢谢。
亚历山德鲁·迪库

此解决方案有效并且看起来很干净。问题:我们不会放松刷新DBContext类的行ID吗?即使用edmx类生成?
NoloMokgosi '16

真不敢相信这是必要的,并且Microsoft并没有以某种方式纠正它-但这对我有用。感谢您的简单解决方案。
沙皇炸弹

此解决方案在功能上与MissingDllHack相同。看起来比较干净,但是将解决方法代码引入了上下文类。该代码还将被标记为由ReSharper之类的工具删除,并且随着时间的流逝很容易丢失。一个好的解决方案,但是我更喜欢以一种不会产生代码警告的方式将变通方法与上下文分开。
Timothy Schoonover,

20

我已经为提供者使用了基于代码的注册。 链接1 链接2

刚刚创建了类似的配置类

class DbContextConfiguration : DbConfiguration
{
    public DbContextConfiguration()
    {
        this.SetDatabaseInitializer(new DropCreateDatabaseAlways<MyDbContext>());
        this.SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
    }
}

关键是this.SetProviderServices(SqlProviderServices.ProviderInvariantName,SqlProviderServices.Instance);

并以这种方式使用

[DbConfigurationType(typeof(DbContextConfiguration))]
public class MyDbContext : DbContext
{
    public MyDbContext()
    {
        ...
    }

    public DbSet<...> ...{ get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        ...
    }
}

一个解决方案中有两个项目。第一个是带有实体框架程序集的DbContext类和tt文件的类库。第二个项目是Windows窗体,应该使用ef-project获取数据。@Nash:您能详细说明您将课程放置在哪个位置(进入哪个项目)DbContextConfiguration吗?谢谢
surfmuggle 2013年

如上所述,似乎附加引用是解决此问题的一种方法(请参阅eric的注释)。我使用nuget控制台并触发了此命令:Get-Project MyWinformsProject | Install-Package EntityFramework它为我修复了它。我还是想更好地了解原因。
surfmuggle 2013年

DbContextConfiguration似乎已经存在(与2013年相比),在MyDbContext类上方添加DbConfiguraton行对我来说没有解决问题。
安德斯·林登(AndersLindén)2016年

您不需要DbConfiguration类。将在应用程序启动下面的代码(使用EF前): DbConfiguration.Loaded += (sender, e) => e.ReplaceService<DbProviderServices>((s, k) => System.Data.Entity.SqlServer.SqlProviderServices.Instance);
Rosberg Linhares

14

我在程序集初始化类中使用[DeploymentItem]进行了整理

namespace MyTests
{
    /// <summary>
    /// Summary description for AssemblyTestInit
    /// </summary>
    [TestClass]
    [DeploymentItem("EntityFramework.SqlServer.dll")]
    public class AssemblyTestInit
    {
        public AssemblyTestInit()
        {
        }

        private TestContext testContextInstance;

        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        [AssemblyInitialize()]
        public static void DbContextInitialize(TestContext testContext)
        {
            Database.SetInitializer<TestContext>(new TestContextInitializer());
        }
    }
}

9

晚会晚了,但对我来说,票数最高的答案似乎简直是骇客。

我所做的就是从测试项目中的app.config中删除以下内容。工作了。

  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>

真正的解决方案!
Ben F

8

我有问题,因为我没有添加对EntityFramework.sqlServer.dll的引用。当我开发程​​序时,它可以工作。但是,当我发布并安装应用程序时,会引发错误。

我只是添加参考,然后再次构建和发布。

参考文献


我做到了这一点,它的工作。基本上,当库中的组件未正确引用时,项目将显示警告。
kbvishnu

5

我已通过手动将EntityFramework.SqlServer.dll文件复制到bin folder主应用程序中来解决了此问题。


4

我终于解决了。原来,我的存储库类中有IDIsposable的错误实现。我修好了 错误的实现导致了stackoverflow异常,因为我没有适当地处理资源。这导致VS无法运行测试,并且测试执行引擎崩溃了。

我在这里向Microsoft提交了文件(这是在获得正确解决方案之前)。connect.microsoft.com/VisualStudio/feedback/details/775868/vs-test-execution-crashes-in-vs-2012#details

无论如何,该构建现在在teamcity上运行良好。虽然,我仍然很好奇,为什么没有VS Test执行引擎都用优美的方式告诉我发生了什么,而不是Team City。

我通过手动调试测试发现了根本原因(直到几天之后我才意识到,修复花了我5秒钟)。

希望这会对遇到此类问题的人有所帮助。


4

我看到了类似的问题,并在这篇文章中使用了该方法:(http://entityframework.codeplex.com/workitem/1590),它解决了我的问题。

要变通解决此问题,您可以通过在测试程序集中的任何位置添加这样的行,使测试程序集直接引用提供程序程序集:var _ = System.Data.Entity.SqlServer.SqlProviderServices.Instance;


3

当我检查问题时,我注意到输出文件夹中缺少以下dll。如果应用程序处于调试模式,则简单的解决方案是将带有app.config的Entityframework.dll和Entityframework.sqlserver.dll复制到输出文件夹。同时更改app.config的构建选项参数“复制到输出文件夹”以始终复制。这样可以解决您的问题。


2
我仅为“ EntityFramework.SqlServer”设置为“ Copy Local”。现在可以了。
Alezis

3

只需引用或浏览EF dll-EntityFramework.SqlServer.dll


这就是我所做的。将对“ EntityFramework.SqlServer”的引用从我的库复制到“运行中”项目。可行!
哈康K. Olafsen

3

我有多次尝试的相同问题,但没有解决,但是当我安装EntityFramework.SqlServerCompact软件包时,它解决了从Nuget软件包管理器安装此软件包的问题。

Install-Package EntityFramework.SqlServerCompact

3

我已经创建了一个静态的“启动”文件,并添加了强制将DLL复制到其中的bin文件夹中的代码,以分隔该“配置”。


[DbConfigurationType(typeof(DbContextConfiguration))] public static class Startup { }

public class DbContextConfiguration : DbConfiguration
{
    public DbContextConfiguration()
    {
        // This is needed to force the EntityFramework.SqlServer DLL to be copied to the bin folder
        SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
    }
}


1
谢谢!这是一个巨大的帮助。
Addison Schuhardt '19

1
很高兴您发现我的回答很有帮助@AddisonSchuhardt :)
hatsrumandcode

2

我不想在我的应用程序项目中引用EF(或手动复制任何内容),因此将其添加到EF项目的构建后事件中:

cp $(TargetDir)EntityFramework.SqlServer.dll $(SolutionDir){your-main-bin-folder}

2

这仅在我的负载/单元测试项目中发生。令人沮丧的是,我在一个已经运行了2年的项目中将其裁剪。一定是某些破坏了事情的测试运行顺序。我想一旦fi被删除就消失了。

我发现仅声明一个使用正确值的变量即可解决此问题……我什至从未调用过该方法。只是定义它。奇怪,但可以。

    /// <summary>
    /// So that the test runner copies dlls not directly referenced by the integration project
    /// </summary>
    private void referenceLibs()
    {
        var useless = SqlProviderServices.Instance;
    }

2

在尝试了所有其他建议的解决方案并且没有使我的项目正常工作之后,我终于在此页面中找到了一些评论:

删除BIN文件夹对我有用

它也对我有用。


1
我正在合并两个分支-我的项目没有与EF相关的更改,但是我的单元测试无缘无故地开始失败。删除BIN文件夹会使它们再次工作。
亚诺·彼得斯

@ Zeek2这个错误是一个棘手的问题。在我引用的页面中,有许多不同的建议可以解决此问题。这只是许多可能的解决方案之一。继续进行研究,直到找到适用于您的特定问题的解决方案,祝您好运。
尤利西斯·阿尔维斯

1

将Entityframework.dll和Entityframework.sqlserver.dll添加到参考项目中可以解决此问题。


1

我检查了单元测试项目中的“调试输出”窗口。尚未加载EntityFramework.SqlServer.dll。将其添加到bin文件夹后,测试成功运行。



1

我在DBContext单元测试项目中实例化对象存在相同的问题。我检查了单元测试项目程序包,发现EntityFramework没有安装程序包,我从Nuget安装了程序包并解决了问题(我认为这是EF错误)。

快乐编码


0

我只是有同样的错误信息。

我有一个单独的项目用于数据访问。在本地运行Web项目(引用了数据项目)效果很好。但是,当我部署Web项目以使程序集变蓝时:未复制EntityFramework.SqlServer。我刚刚将引用添加到Web项目中并重新部署,现在它可以工作了。

希望这对别人有帮助


0

我正在离线研究Contoso大学教程,尝试使用EF创建我的第一个控制器时遇到了相同的问题。我必须使用程序包管理器控制台从nuget缓存中加载EF并创建到我的SQL Server本地实例的连接字符串,我的意思是我可能没有设置EF的webConfig设置,但是我能够通过完全删除“ entityFramework”中的“ providers”部分来解决我的问题

罗伯特


0

有一个简单的解决方法。打开项目中的引用,右键单击“ System.Data”->“属性”。将“本地复制”更改为“真”。

问题应该解决。


0

就我而言,我以前安装过SQL Server Express 2012(x64)时,通过安装SQL Server 2012 Developer Edition解决了该问题。似乎为我提供了缺少的依赖关系。


0

通过nuget从项目中删除实体框架,然后重新添加。


0

就我而言dll,尽管我添加了对它的引用,但未复制它。这是因为EntityFramework.SqlServer.dll未复制到您的项目中。添加该dll,它有望运行。您可以在添加了datamodel的项目中找到它。


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.