Entity Framework Provider type could not be loaded?
我正在尝试在当前安装在我的计算机上的TeamCity上运行测试。
System.InvalidOperationException :The Entity Framework provider type
'System.Data.Entity.SqlServer.SqlProviderServices, ,
EntityFramework.SqlServerVersion=6.0.0.0, Culture=neutral, for the '
PublicKeyToken=b77a5c561934e089'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..
我在我的任何项目中都没有提到
所以,我不知道为什么我会得到这个例外。当我从vs.
我确实尝试将copyloc设置为false,然后再次设置为true。但这似乎也行不通。
更新
我的app.config有以下内容。这会导致一些我不理解的行为吗?
1 2 3 4 5 6 7 8 9 10 | <?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。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | [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 epository\Infrastructure\EFRepository.cs:line 22 at IntegrationTests.CrudTest.Initialize() in c:\TeamCity\buildAgent\work\da2ea4e72c0e77f0\IntegrationTests\CrudTest.cs:line 34 |
同样的问题,但我通过Nuget安装了EF6。另一个可执行文件缺少EntityFramework.sqlserver。我只是把Nuget包添加到那个项目中。
我在测试项目中遇到了同样的问题——我通过nuget安装了最新的ef6位,每当我调用与ef相关的东西时,我都会得到:
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.
我的解决方法:我把这个方法放在我的测试项目中:
1 2 3 4 5 6 7 8 9 | 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测试失败的内容。
无论如何:在我的机器上工作;)
注意:您可以确保从模型/实体项目静态引用sqlproviderservices,而不是将该方法添加到测试项目中。
Nuget会将EF6项目配置为引用EntityFramework.sqlserver.dll。这将在生成期间部署到EF6项目的输出文件夹,但对于引用EF6项目的项目,它不会部署到输出文件夹。我认为这是因为Visual Studio足够"智能",可以检测到程序集中没有任何东西实际直接使用dll,因此不包括它。通过向使用entityframework.sqlserver.dll的EF6项目添加代码,可以强制将entityframework.sqlserver.dll部署到引用EF6项目(单元测试、UI等)的项目的输出文件夹中。小心不要将代码放在生成的类中,因为在下一次重新生成时可能会丢失代码。我选择将以下类添加到程序集,这解决了问题。
1 2 3 4 5 6 7 8 9 | 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; } |
我的解决方案是通过nuget管理器从项目中移除实体框架,并将其添加回。
我通过在dbContext类上添加using stament解决了这个问题,如下所示:
1 | using SqlProviderServices= System.Data.Entity.SqlServer.SqlProviderServices; |
我已经为提供者使用了基于代码的注册。LIK1Link 2
刚刚创建了配置类
1 2 3 4 5 6 7 8 | class DbContextConfiguration : DbConfiguration { public DbContextConfiguration() { this.SetDatabaseInitializer(new DropCreateDatabaseAlways<MyDbContext>()); this.SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance); } } |
关键点是this.setProviderServices(sqlsProviderServices.ProviderInVariantName,sqlsProviderServices.Instance);
用这种方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [DbConfigurationType(typeof(DbContextConfiguration))] public class MyDbContext : DbContext { public MyDbContext() { ... } public DbSet<...> ...{ get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { ... } } |
我在程序集初始化类时用[deploymentem]对其进行了排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | 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()); } } } |
参加晚会迟到了,但最受欢迎的答案对我来说都像是胡扯。
我所做的只是从测试项目的app.config中删除以下内容。工作。
1 2 3 4 5 6 7 8 9 10 | <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> |
我有问题,因为我没有添加对entityframework.sqlserver.dll的引用。当我开发程序时,它是有效的。但当我发布并安装应用程序时,它会抛出错误。
我只是添加引用,然后重新构建和发布。
我看到了类似的问题,并使用了本文中的方法(http://entityframework.codeplex.com/workitem/1590),这解决了我的问题。
要解决此问题,可以通过在测试程序集中的任何位置添加类似这样的行,使测试程序集直接引用提供程序程序集:var uu=system.data.entity.sqlserver.sqlproviderservices.instance;
我终于解决了这个问题。结果,我在我的知识库类中有一个IDisposable的错误实现。我确定了。错误的实现导致了stackoverflow异常,因为我没有正确地处理资源。这导致vs不运行测试,测试执行引擎崩溃。
我在这里把它提交给微软(这是在我得到正确的解决方案之前)。connect.microsoft.com/VisualStudio/Feedback/Details/775868/vs-test-execution-crasks-in-vs-2012详细信息
不管怎样,现在TeamCity的构建运行良好。尽管如此,我仍然好奇为什么VS测试执行引擎都没有一种优雅的方式来告诉我发生了什么,而不是团队城市。
我通过手动调试测试发现了根本原因(这是我在很多天之后才意识到的,修复花费了我5秒钟)。
希望这能帮助遇到此类问题的人。
我通过手动将
我也有同样的问题,我尝试了很多次,但没有解决,但当我安装包entityframework.sqlservercompact时,它解决了从nuget包管理器安装这个包。
1 | Install-Package EntityFramework.SqlServerCompact |
只需引用或浏览ef dll-entityframework.sqlserver.dll
当我检查问题时,我注意到输出文件夹中缺少以下dll。如果应用程序处于调试模式,简单的解决方案是将带有app.config的entityframework.dll和entityframework.sqlserver.dll复制到输出文件夹。同时,将app.config的build选项参数"copy to output folder"更改为"copy always"。这将解决你的问题。
我不希望在我的应用程序项目中引用EF(或手动复制任何内容),因此我将其添加到我的EF项目的后期生成事件中:
1 | cp $(TargetDir)EntityFramework.SqlServer.dll $(SolutionDir){your-main-bin-folder} |
在尝试了所有其他建议的解决方案,但没有使我的项目正常运行之后,我终于在本页找到了一些评论:
Deleting the BIN-Folder did it for me
这对我也很管用。
这只发生在我的负载/单元测试项目中。令人沮丧的是,我在一个我已经运行了两年的项目中突然发现了它。一定是测试运行的顺序破坏了一切。我想一旦FI被移除,它就消失了。
我发现只要声明一个使用正确值的变量就可以解决这个问题…我从来没有调用过这个方法。定义一下。很奇怪,但它起作用了。
1
2
3
4
5
6
7 /// <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添加到引用项目中解决了此问题。
我检查了单元测试项目中的调试输出窗口。未加载EntityFramework.sqlserver.dll。将其添加到bin文件夹后,测试成功运行。
我也有类似的问题
我的问题通过以下步骤解决:
我已经创建了一个静态的"启动"文件,并添加了代码来强制将dll复制到其中的bin文件夹中,以此来分隔这个"配置"。
[DbConfigurationType(typeof(DbContextConfiguration))]
public static class Startup
{
}
ZZU1〔1〕
在我的例子中,我通过安装SQL Server 2012 Developer Edition(以前安装过SQL Server Express 2012(x64))来解决这个问题。这似乎为我提供了缺失的依赖。
单击"引用>检查EntityFramework引用是否存在"
如果不可用,添加它
点击
Add Reference > Add entity framework 1)EntityFrameWork
2)EntityFrameWork.SqlServer
在我的例子中,虽然添加了一个引用,但没有复制
除了这里所有有用的建议外,如果您使用的是EF6.1.3,请确保您的项目的.NET版本是4.5或更高。
有一个简单的解决办法。打开项目中的引用,右键单击"System.Data"->Properties。将"复制本地"更改为"真"。
应该解决问题。
在我的例子中,问题是为了捕获另一个异常,我启用了公共语言运行时(CLR)异常。我忘了禁用它。
我在异常设置中禁用了它。它忽略了这个异常,继续运行并自动为我(在我的例子中)创建一个数据库。
我正在离线编写Contoso大学教程,在尝试使用EF创建第一个控制器时遇到了同样的问题。我不得不使用包管理器控制台从nuget缓存加载ef,并创建了一个到我的本地SQL Server实例的连接字符串,这里我的观点是,我的ef webconfig设置可能不会像你们一样设置,但我能够通过完全删除"entityframework"中的"providers"部分来解决我的问题。
罗伯特
确保entityframework.dll、entityframework.sql server.dll和提供程序的dll(对于SQL Server Compact,这将是entityframework.sqlserverCompact.dll)位于已部署的应用程序文件夹中。这对于部署的应用程序尤其重要。
我刚刚收到同样的错误信息。
我有一个单独的项目用于数据访问。在本地运行Web项目(引用了数据项目)工作得很好。但当我将Web项目部署到Azure时,程序集:entityframework.sqlserver未被复制。我刚刚添加了对Web项目的引用并重新部署,现在它工作了。
希望这能帮助别人
我在我的CI构建服务器(运行bamboon)上遇到了完全相同的问题,它没有安装任何Visual Studio IDE。
不需要对构建/测试过程进行任何代码更改(我认为这不是一个好的解决方案),最好的方法是复制
问题解决了!
我在从一个单元测试项目实例化
快乐编码
通过nuget从项目中移除实体框架,然后将其添加回。