Estou tentando executar meus testes no TeamCity, que está atualmente instalado na minha máquina.
System.InvalidOperationException
:O tipo de provedor do Entity Framework '
System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer
,Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
para oSystem.Data.SqlClient
provedor ' 'ADO.NET não pôde ser carregado. Verifique se o conjunto do provedor está disponível para o aplicativo em execução.Consulte http://go.microsoft.com/fwlink/?LinkId=260882 para obter mais informações.
Não tenho referência a System.Data.Entity
nenhum dos meus projetos, como foi sugerido no codeplex para atualizar para o EF6.
Portanto, não sei por que estou recebendo essa exceção. Não recebo nenhuma exceção ao executar os testes do VS.
Tentei definir CopyLocal como false e novamente como true ... mas isso também não parece funcionar.
Atualizar
Meu app.config tem o seguinte. Isso causa algum comportamento que eu não entendo?
<?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>
Eu recebo o seguinte stacktrace no 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
fonte
private volatile Type _dependency...
resposta e funcionou! Apenas cheira mal que eu tenho que adicionar uma classe separada como esta apenas para que a EF trabalhe no TeamCity.Respostas:
Mesmo problema, mas eu instalei o EF 6 através do Nuget. Faltava EntityFramework.SqlServer para outro executável. Simplesmente adicionei o pacote nuget a esse projeto.
fonte
x.ToString()
isso, ou ele eliminará ostypeof
s no Release.Eu tive o mesmo problema em meus projetos de teste - instalei os bits EF6 mais recentes via NuGet e sempre que invocava algo relacionado ao EF, obtinha:
Minha solução alternativa: coloquei esse método dentro do meu projeto de teste:
Esse método nunca foi chamado, mas acho que o compilador removerá todos os assemblies "desnecessários" e, sem usar o material EntityFramework.SqlServer, o teste falhará.
De qualquer forma: funciona na minha máquina;)
Nota: Em vez de adicionar o método para testar o projeto, você pode garantir uma referência estática ao SqlProviderServices do seu projeto de Modelo / entidade .
fonte
DbContext
classe resolverá o problema no EF 6.1. Dessa forma, você não precisa incluir o pacote Entity Framework Nuget no seu projeto front-end (WebApi, etc) e pode deixar tudo relacionado ao EF em sua camada de dados.Nuget configurará seu projeto EF6 para referenciar EntityFramework.SqlServer.dll. Isso é implantado na pasta de saída do seu projeto EF6 durante a compilação, mas não será implantado na pasta de saída dos projetos que fazem referência ao seu projeto EF6. Eu acredito que isso ocorre porque o Visual Studio é "inteligente" o suficiente para detectar que nada no seu assembly está realmente usando a dll diretamente e, portanto, não o inclui. Você pode forçar o EntityFramework.SqlServer.dll a ser implantado na pasta de saída dos projetos que fazem referência ao seu projeto EF6 (testes de unidade, UIs etc.) adicionando código ao seu projeto EF6 que usa EntityFramework.SqlServer.dll. Cuidado para não colocar o código em uma classe gerada, pois corre o risco de perdê-lo na próxima regeneração. Eu escolhi adicionar a seguinte classe ao assembly, que resolveu o problema.
fonte
Minha solução foi remover a estrutura da entidade do projeto por meio do gerenciador de nuget e adicioná-la novamente.
fonte
PM> Update-Package -Reinstall "EntityFramework" -ProjectName "MyProj1"
Eu resolvi isso adicionando um stament usando no topo da minha classe DBContext, assim:
fonte
Eu usei o registro baseado em código para provedor. link1 link2
Acabei de criar a classe de configuração como
O ponto principal é this.SetProviderServices (SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
e usou dessa maneira
fonte
DbContextConfiguration
? ObrigadoGet-Project MyWinformsProject | Install-Package EntityFramework
que o corrigiu para mim. Ainda assim, eu gostaria de entender melhor o motivo.DbConfiguration.Loaded += (sender, e) => e.ReplaceService<DbProviderServices>((s, k) => System.Data.Entity.SqlServer.SqlProviderServices.Instance);
.Eu resolvi isso com [DeploymentItem] na minha classe de inicialização do assembly
fonte
Tarde para a festa, mas as respostas mais votadas pareciam hack para mim.
Tudo o que fiz foi remover o seguinte do meu app.config no projeto de teste. Trabalhou.
fonte
Estou com problema, porque não adiciono referência ao EntityFramework.sqlServer.dll. Quando eu desenvolvo um programa, ele funciona. Mas quando publico um aplicativo e o instalo, gera um erro.
Acabei de adicionar referência e criar e publicar novamente.
fonte
Eu resolvi isso copiando manualmente o
EntityFramework.SqlServer.dll
arquivo para obin folder
aplicativo principal.fonte
Eu finalmente resolvi isso. Acontece que eu tive uma implementação incorreta de IDIsposable na minha classe de repositório. Eu consertei isso. A implementação incorreta causou uma exceção do stackoverflow, pois eu não estava descartando os recursos corretamente. Isso fez com que o VS não executasse os testes e o mecanismo de execução do teste travou.
Arquivei na Microsoft aqui (isso foi antes de eu obter a solução correta). connect.microsoft.com/VisualStudio/feedback/details/775868/vs-test-execution-crashes-in-vs-2012#details
De qualquer forma, as compilações agora funcionam bem no teamcity. Embora eu ainda esteja curioso para saber por que nenhum mecanismo de execução do VS Test teve uma maneira graciosa de me dizer o que estava acontecendo, não o Team City.
Eu descobri a causa raiz depurando manualmente o teste (que eu só percebi depois de tantos dias, a correção levou 5 segundos).
Espero que isso ajude alguém que se depara com esses problemas.
fonte
Vejo um problema semelhante e, usando o método deste post: ( http://entityframework.codeplex.com/workitem/1590 ), que resolve meu problema.
Para contornar o problema, você pode fazer seu assembly de teste referenciar diretamente o assembly do provedor, adicionando alguma linha como esta em qualquer lugar do assembly de teste: var _ = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
fonte
Quando inspecionei o problema, notei que a seguinte DLL estava ausente na pasta de saída. A solução simples é copiar Entityframework.dll e Entityframework.sqlserver.dll com o app.config para a pasta de saída, se o aplicativo estiver no modo de depuração. Ao mesmo tempo, altere o parâmetro da opção de construção "Copiar para a pasta de saída" do app.config para copiar sempre. Isto irá resolver o seu problema.
fonte
Basta referenciar ou navegar na dll EF - EntityFramework.SqlServer.dll
fonte
Eu tive o mesmo problema que tentei várias vezes, mas não foi resolvido, mas quando instalo o pacote EntityFramework.SqlServerCompact, ele resolveu instalar este pacote no Nuget package Manager.
fonte
Eu criei um arquivo estático de "inicialização" e adicionei o código para forçar a DLL a ser copiada para a pasta bin, como forma de separar essa 'configuração'.
[DbConfigurationType(typeof(DbContextConfiguration))] public static class Startup { }
fonte
Eu não queria uma referência ao EF no meu projeto de aplicativo (ou para copiar manualmente qualquer coisa), então adicionei isso aos eventos de Pós-construção do meu projeto EF:
fonte
Isso acontece apenas dentro dos meus projetos de teste de carga / unidade. Frustrante, eu o fiz surgir em um projeto em que estou executando há 2 anos. Deve ter havido alguma ordem de execução de teste que quebra as coisas. Acho que assim que o fi é removido, ele se foi.
Eu descobri que simplesmente declarar uma variável que usa o valor correto corrige o problema ... Eu nunca chamo o método. Apenas defina. Estranho, mas funciona.
fonte
Depois de tentar todas as outras soluções sugeridas e não fazer meu projeto funcionar, finalmente encontrei um pequeno comentário nesta página :
E funcionou para mim também.
fonte
A adição de Entityframework.dll e Entityframework.sqlserver.dll ao projeto de referência resolveu o problema.
fonte
Eu verifiquei a janela Debug Output no projeto Unit Test. EntityFramework.SqlServer.dll não foi carregado. Depois de adicioná-lo à pasta bin, os testes foram executados com sucesso.
fonte
Eu também tive um problema semelhante
Meu problema foi resolvido da seguinte maneira:
fonte
Eu tive o mesmo problema com o
DBContext
objeto de instanciação de um projeto de teste de unidade. Eu verifiquei meus pacotes de projeto de teste de unidade e achei queEntityFramework
pacote não estava instalado, instalei o do Nuget e resolvi o problema (acho que é um bug do EF).codificação feliz
fonte
Acabei de receber a mesma mensagem de erro.
Eu tenho um projeto separado para o meu acesso a dados. A execução do projeto da Web (que referenciou o projeto de dados) funcionou localmente bem. Mas quando implantei o projeto da web para criar o azure do assembly: EntityFramework.SqlServer não foi copiado. Acabei de adicionar a referência ao projeto web e reimplantá-lo, agora ele funciona.
espero que isso ajude os outros
fonte
Eu estava trabalhando no tutorial da Contoso University offline e encontrou o mesmo problema ao tentar criar meu primeiro controlador usando EF. Eu tive que usar o Package Manager Console para carregar o EF do cache de nuget e criei uma cadeia de conexão para minha instância local do SQL Server. Meu ponto aqui é a minha configuração webConfig para EF pode não estar definida como todos, mas eu consegui resolver meu problema excluindo completamente a seção "fornecedores" em "entityFramework"
Robert
fonte
Existe uma solução fácil. abra as referências no seu projeto, clique com o botão direito do mouse em "System.Data" -> Propriedades. Altere "Copiar local" para "Verdadeiro".
Problema deve ser corrigido.
fonte
No meu caso, resolvi o problema instalando o SQL Server 2012 Developer Edition quando havia instalado o SQL Server Express 2012 (x64). Parece que me forneceu a dependência que faltava.
fonte
remova a estrutura da entidade do projeto via nuget e adicione-a novamente.
fonte
No meu caso,
dll
não foi copiado, embora eu tenha adicionado uma referência a ele. Isso ocorre porqueEntityFramework.SqlServer.dll
não é copiado para o seu projeto. Adicione essa dll e esperamos que funcione. Você pode encontrar isso no projeto em que adicionou o modelo de dados.fonte
Além de todas as sugestões úteis aqui, se você estiver usando o EF 6.1.3, verifique se a versão .net do seu projeto é 4.5 ou superior.
fonte