entity framework提供程序types无法加载?

我想在我的机器上安装的TeamCity上运行我的testing。

System.InvalidOperationException

System.Data.SqlClient ”ADO.NET提供程序的entity framework提供程序types“ System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServerVersion=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'不能加载。 确保提供者程序集可用于正在运行的应用程序。

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

在我的任何项目中都没有提及System.Data.Entity ,就像在codeplex上build议升级到EF6一样。

所以,我不知道为什么我得到这个exception。 当我从VS运行testing时,我没有得到任何这样的exception。

我确实尝试将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中获得以下堆栈跟踪。

 [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 

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

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

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

我的解决方法:我把这个方法放在我的testing项目中:

 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的东西testing失败。

反正:在我的机器上工作;)

注意: 不要将方法添加到testing项目中,而是可以确保从模型/实体项目对SqlProviderServices进行静态引用 。

Nuget将configuration您的EF6项目以引用EntityFramework.SqlServer.dll。 这将在构build期间部署到EF6项目的输出文件夹,但不会将其部署到用于引用EF6项目的项目的输出文件夹。 我相信这是因为Visual Studio是“聪明的”,足以检测到你的程序集中没有任何东西是直接使用dll,所以不包含它。 您可以通过向使用EntityFramework.SqlServer.dll的EF6项目添加代码,将EntityFramework.SqlServer.dll部署到引用您的EF6项目(unit testing,UI等)的项目的输出文件夹中。 注意不要将代码放在生成的类中,因为在下一次再生时可能会丢失代码。 我select将下面的类添加到程序集中,从而解决了问题。

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

我的解决scheme是通过nugetpipe理器从项目中删除entity framework,并将其添加回来。

我通过在DBContext类的顶部添加一个statern来解决这个问题,如下所示:

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

我已经使用基于代码的注册提供商。 link1 link2

刚刚创build了类似的configuration类

 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) { ... } } 

我用我的程序集初始化类中的[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()); } } } 

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

我只是再次添加引用和生成和发布。

参考

晚会之后,但是最高票的答案对我来说似乎都是黑客。

我所做的只是从testing项目中的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> 

我终于解决了这个问题 原来,我在我的仓库类中有一个错误的IDIsposable实现。 我解决了这个问题 错误的实现导致了一个stackoverflowexception,因为我没有妥善处理资源。 这导致VS不运行testing和testing执行引擎崩溃。

我在这里提交给微软(这是在我得到正确的解决scheme之前)。 connect.microsoft.com/VisualStudio/feedback/details/775868/vs-test-execution-crashes-in-vs-2012#details

无论如何,builds现在在teamcity上运行良好。 尽pipe如此,我还是很好奇为什么VS Test执行引擎没有一个优雅的方式告诉我发生了什么事,而不是Team City。

我通过手动debuggingtesting发现了根本原因(我只在这么多天后才意识到,修复花了我5秒)。

希望这会帮助遇到这样的问题的人。

我看到类似的问题,并从这个post使用的方法:( http://entityframework.codeplex.com/workitem/1590 ),这解决了我的问题。

要解决这个问题,你可以通过在testing程序集中的任何地方添加一些这样的代码来直接引用提供者程序集,从而使得你的testing程序集可以直接引用:var _ = System.Data.Entity.SqlServer.SqlProviderServices.Instance;

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

当我检查了这个问题,我注意到在输出文件夹中缺less以下dll。 简单的解决scheme是复制Entityframework.dll和Entityframework.sqlserver.dll与app.config到输出文件夹,如果应用程序处于debugging模式。 同时改变,始终复制app.config的build选项参数“Copy to output folder”。 这将解决您的问题。

我在unit testing项目中检查了debugging输出窗口。 EntityFramework.SqlServer.dll未加载。 将其添加到bin文件夹后,testing成功运行。

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

我不想在我的应用程序项目中引用EF(或手动复制任何东西),所以我将其添加到我的EF项目的后构build事件中:

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

这只发生在我的负载/unit testing项目中。 令人沮丧的是,我已经在一个我已经跑了两年的项目中出现了。 一定是一些testing运行的顺序,打破了事情。 我想,一旦这个fi被删除了,它就消失了。

我发现只是声明一个使用正确值的variables可以解决问题…我甚至从来没有调用过这个方法。 只要定义它。 奇怪,但它的作品。

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

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

我有一个单独的项目为我的数据访问。 运行Web项目(引用数据项目)在本地工作得很好。 但是当我将web项目部署到azure色的程序集时:EntityFramework.SqlServer未被复制。 我刚刚添加了对web项目的引用,并重新部署,现在它的工作。

希望这有助于他人

我在离线工作的Contoso大学教程,并尝试使用EF创build我的第一个控制器时遇到同样的问题。 我必须使用软件包pipe理器控制台从nugetcaching中加载EF,并创build一个连接string到我的本地SQL Server实例,这里我的要点是我的EF的webConfig设置可能没有设置,因为你都在那里,但我能通过完全删除“entityFramework”中的“providers”部分来解决我的问题

罗伯特

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

问题应该得到解决。

在我的情况下,当我以前安装SQL Server Express 2012(x64)时,通过安装SQL Server 2012 Developer Edition来解决问题。 这似乎给我提供了缺失的依赖。

将Entityframework.dll和Entityframework.sqlserver.dll添加到参考项目解决了问题。

通过nuget从项目中删除entity framework,然后重新添加。

在我的情况下, dll并没有被复制,虽然我添加了一个引用。 这是因为EntityFramework.SqlServer.dll没有被复制到你的项目中。 添加该DLL,它将希望工作。你可以从你添加datamodel的项目中find。

除此之外,如果您使用的是EF 6.1.3,请确保您的项目的.net版本是4.5或更高。

在我的情况下,问题是为了赶上另一个exception,我已经启用公共语言运行时(CLR)exception。 我忘了禁用它。

我在我的例外设置中禁用了它。 它忽略了这个exception,并继续运行并自动为我创build一个数据库(在我的情况下)。

确保EntityFramework.dll,EntityFramework.SqlServer.dll和您的提供者的DLL(对于SQL Server Compact,这将EntityFramework.SqlServerCompact.dll)在部署的应用程序文件夹中。 这对于部署应用程序尤其重要。

我也有类似的问题

我的问题是通过执行以下操作来解决的:

在这里输入图像描述

在这里输入图像描述