实体框架提供程序类型无法加载?
我试图在我的机器上安装的TeamCity上运行我的测试。
System.InvalidOperationException
:
“ System.Data.SqlClient
”ADO.NET提供程序的实体框架提供程序类型“ System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer
, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
无法加载。 确保提供者程序集对正在运行的应用程序可用。
请参阅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中获得了以下堆栈跟踪。
[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:TeamCitybuildAgentworkda2ea4e72c0e77f0RepositoryInfrastructureEFRepository.cs:line 22
at IntegrationTests.CrudTest.Initialize() in c:TeamCitybuildAgentworkda2ea4e72c0e77f0IntegrationTestsCrudTest.cs:line 34
同样的问题,但我通过Nuget安装了EF 6。 另一个可执行文件缺少EntityFramework.SqlServer。 我只是将nuget包添加到该项目。
我在测试项目中遇到了同样的问题 - 我通过NuGet安装了最新的EF6位,每次调用与EF相关的东西时,我都会得到:
无法加载“System.Data.SqlClient”ADO.NET提供程序的实体框架提供程序类型“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,测试失败。
反正:在我的机器上工作;)
注意:不要将方法添加到测试项目中,您可以确保从模型/实体项目对SqlProviderServices进行静态引用。
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;
}
链接地址: http://www.djcxy.com/p/21121.html
上一篇: Entity Framework Provider type could not be loaded?
下一篇: The entity cannot be constructed in a LINQ to Entities query