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

我正在尝试在TeamCity上运行我的测试,它目前安装在我的机器上。

System.InvalidOperationException:

实体框架提供者类型 ' <代码> System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework。SqlServer, 版本=6.0.0.0,文化=中性, PublicKeyToken=b77a5c561934e089' for 'System.Data.SqlClient' ADO。NET提供程序无法加载。确保提供程序集 对正在运行的应用程序可用。< / p >

参见http://go.microsoft.com/fwlink/?LinkId=260882获取更多信息 信息. . < / p >

我在我的任何项目中都没有引用System.Data.Entity,因为codeplex建议升级到EF6。

所以,我不确定为什么我得到这个异常。 当我从VS.

运行测试时,我没有得到任何这样的异常

我尝试设置CopyLocal为假,然后再次为真..但这似乎也不管用。

更新

我的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
302841 次浏览
我终于解决了这个问题。事实证明,我在存储库类中有一个错误的IDIsposable实现。我解决了。 错误的实现导致了stackoverflow异常,因为我没有正确地处理资源。这导致VS不运行测试,测试执行引擎崩溃 我在微软这里提交了它(这是在我得到正确的解决方案之前)。 connect.microsoft.com/visualstudio/feedback/details/775868/vs -测试-执行-崩溃- vs - 2012 #的细节 < / p >

不管怎样,构建现在在teamcity上运行良好。尽管如此,我还是很好奇为什么没有VS Test执行引擎能够优雅地告诉我Team City发生了什么。

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

希望这篇文章能对遇到此类问题的人有所帮助。

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

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

实体框架提供者类型 “System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework。用于System.Data. SqlServer。SqlClient ADO。网 无法加载提供程序。确保提供程序集是 对正在运行的应用程序可用。看到

. 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 stuff测试失败。

不管怎样:在我的机器上工作;)

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

我已经使用基于代码的注册提供程序。 link1 link2 < / p >

刚刚创建了配置类

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

Nuget将配置您的EF6项目引用EntityFramework.SqlServer.dll。这将在构建期间部署到EF6项目的输出文件夹,但不会部署到引用EF6项目的项目的输出文件夹。我相信这是因为Visual Studio足够“聪明”,可以检测到程序集中没有任何东西实际上直接使用dll,因此不包含它。通过向EF6项目中添加使用EntityFramework.SqlServer.dll的代码,可以强制将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;
}

我只是收到了同样的错误信息。

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

希望这能帮助到其他人

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

为了解决这个问题,你可以让你的测试程序集直接引用提供者程序集,在测试程序集的任何地方添加一些像这样的行: var _ = System.Data.Entity.SqlServer.SqlProviderServices.Instance
我在Contoso大学教程离线工作,当尝试使用EF创建我的第一个控制器时遇到了同样的问题。 我不得不使用包管理器控制台从nuget缓存中加载EF,并创建了一个连接字符串到我的SQL Server本地实例,我在这里的重点是我的webConfig设置EF可能不会设置为你们所有人,但我能够通过完全删除“entityFramework”

中的“providers”部分来解决我的问题

罗伯特。

我在程序集初始化类上使用[deploymenttem]整理了它

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

有一个简单的解决办法。打开项目中的引用,右键单击“System”。Data" ->属性。将“Copy Local”改为“True”。

问题应该得到解决。

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

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

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

我只是再次添加引用和构建并发布。

References

在我的情况下,我通过安装SQL Server 2012开发版解决了这个问题,而我之前已经安装了SQL Server Express 2012 (x64)。这似乎为我提供了缺失的依赖关系。

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

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

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

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

通过nuget将实体框架从项目中移除,然后再将其添加回来。

在我的例子中,虽然我添加了一个引用,但dll没有被复制。这是因为__abc1没有复制到你的项目中。添加该dll,它将有望工作。您可以从添加数据模型的项目中找到这一点。

除了这里所有有用的建议之外,如果您使用的是EF 6.1.3,请确保您的项目的。net版本是4.5或更高。

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

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

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

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

派对来晚了,但投票最多的答案对我来说都像是黑客。

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

我的问题在于,为了捕获另一个异常,我启用了公共语言运行时(CLR)异常。我忘了禁用它。

我在异常设置中禁用了它。它忽略了这个异常,继续运行并自动为我(在我的情况下)创建一个db。

这只发生在我的负载/单元测试项目中。令人沮丧的是,我在一个已经运行了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;
}

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

我也遇到过类似的问题

我的问题是通过以下方法解决的:

enter image description here

enter image description here

我在我的CI构建服务器(运行Bamboo)上遇到了完全相同的问题,它没有安装任何Visual Studio IDE。

在不更改构建/测试过程的任何代码的情况下(我不认为这是一个好的解决方案),最好的方法是复制EntityFramework.SqlServer.dll并将其粘贴到C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE。(你在哪里奔跑)

问题解决了!

我在从单元测试项目实例化DBContext对象时遇到了同样的问题。我检查了我的单元测试项目包,我发现EntityFramework包没有安装,我从Nuget安装了它,问题解决了(我认为这是EF的bug)。

快乐的编码

我有同样的问题,我尝试了很多次,但它没有解决,但当我安装包EntityFramework。SqlServerCompact解决了从Nuget包管理器安装这个包。

Install-Package EntityFramework.SqlServerCompact

在尝试了所有其他建议的解决方案并没有让我的项目工作后,我终于在这个页面中找到了一个小注释:

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

这对我也很有效。

我已经创建了一个静态的“启动”文件,并添加了代码来强制DLL被复制到其中的bin文件夹中,作为分离这个“配置”的一种方式。

< p > <代码> < br > [DbConfigurationType typeof (DbContextConfiguration))) 公共静态类 { } < / p >
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);
}
}

> < /代码

点击参考>检查EntityFramework参考是否存在

如果没有,请添加

点击

添加引用>添加实体框架1)实体框架 2) EntityFrameWork。< / p >状态"置疑"