Estoy tratando de ejecutar mis pruebas en TeamCity, que actualmente está instalado en mi máquina.
System.InvalidOperationException
:El tipo de proveedor Entity Framework '
System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer
,Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
para el'System.Data.SqlClient
'proveedor ADO.NET no se pudo cargar. Asegúrese de que el ensamblaje del proveedor esté disponible para la aplicación en ejecución.Consulte http://go.microsoft.com/fwlink/?LinkId=260882 para obtener más información.
No tengo ninguna referencia System.Data.Entity
en ninguno de mis proyectos como se sugirió en codeplex para actualizar a EF6.
Entonces, no estoy seguro de por qué obtengo esta excepción. No obtengo ninguna excepción cuando ejecuto las pruebas de VS.
Intenté configurar CopyLocal en falso y luego nuevamente en verdadero ... pero eso tampoco parece funcionar.
Actualizar
Mi app.config tiene lo siguiente. ¿Esto causa algún comportamiento que no entiendo?
<?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>
Obtengo el siguiente stacktrace en 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
fuente
private volatile Type _dependency...
respuesta y funcionó! Simplemente apesta que tengo que agregar una clase separada como esta solo para que EF funcione en TeamCity.Respuestas:
Mismo problema, pero instalé EF 6 a través de Nuget. Faltaba EntityFramework.SqlServer para otro ejecutable. Simplemente agregué el paquete nuget a ese proyecto.
fuente
x.ToString()
o eliminará eltypeof
s en la versión.Tuve el mismo problema en mis proyectos de prueba: instalé los últimos bits EF6 a través de NuGet y cada vez que invoco algo relacionado con EF recibí:
Mi solución: puse este método dentro de mi proyecto de prueba:
Este método nunca se ha llamado, pero creo que el compilador eliminará todos los ensamblados "innecesarios" y sin usar el material EntityFramework.SqlServer, la prueba falla.
De todos modos: funciona en mi máquina;)
Nota: en lugar de agregar el método para probar el proyecto, puede garantizar una referencia estática a SqlProviderServices desde su proyecto Modelo / entidad .
fuente
DbContext
clase resolverá el problema en EF 6.1. De esta manera, no necesita incluir el paquete Entity Framework Nuget en su proyecto front-end (WebApi, etc.) y puede dejar todo lo relacionado con EF en su capa de datos.Nuget configurará su proyecto EF6 para hacer referencia a EntityFramework.SqlServer.dll. Esto se implementa en la carpeta de salida para su proyecto EF6 durante la compilación, pero no se implementará en la carpeta de salida para proyectos que hagan referencia a su proyecto EF6. Creo que esto se debe a que Visual Studio es lo suficientemente "inteligente" como para detectar que nada en su ensamblado está usando el dll directamente, por lo que no lo incluye. Puede forzar la implementación de EntityFramework.SqlServer.dll en la carpeta de salida de proyectos que hacen referencia a su proyecto EF6 (pruebas unitarias, UI, etc.) agregando código a su proyecto EF6 que utiliza EntityFramework.SqlServer.dll. Tenga cuidado de no poner el código en una clase generada, ya que corre el riesgo de perderlo en la próxima regeneración. Elegí agregar la siguiente clase al ensamblado, lo que solucionó el problema.
fuente
Mi solución fue eliminar el marco de la entidad del proyecto a través del administrador nuget y agregarlo nuevamente.
fuente
PM> Update-Package -Reinstall "EntityFramework" -ProjectName "MyProj1"
Resolví esto agregando un estado de uso en la parte superior de mi clase DBContext, así:
fuente
He utilizado el registro basado en código para el proveedor. enlace1 enlace2
Acabo de crear la clase de configuración como
El punto clave es este: SetProviderServices (SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
y lo usé de esa manera
fuente
DbContextConfiguration
? GraciasGet-Project MyWinformsProject | Install-Package EntityFramework
que me lo arregló. Aún así me gustaría entender mejor la razón.DbConfiguration.Loaded += (sender, e) => e.ReplaceService<DbProviderServices>((s, k) => System.Data.Entity.SqlServer.SqlProviderServices.Instance);
.Lo resolví con [DeploymentItem] en mi clase de inicialización de ensamblado
fuente
Tarde a la fiesta, pero las respuestas más votadas me parecieron hacks.
Todo lo que hice fue eliminar lo siguiente de mi app.config en el proyecto de prueba. Trabajó.
fuente
Tengo un problema, porque no agrego referencia a EntityFramework.sqlServer.dll. Cuando desarrollo el programa, funciona. Pero cuando publico la aplicación y la instalo, arroja un error.
Solo agrego referencia y Construir y publicar nuevamente.
fuente
He resuelto esto copiando manualmente el
EntityFramework.SqlServer.dll
archivo en labin folder
aplicación principal.fuente
Finalmente resolví esto. Resulta que tuve una implementación errónea de IDIsposable en mi clase de repositorio. Lo arreglé La implementación errónea causó una excepción stackoverflow ya que no estaba eliminando los recursos correctamente. Esto provocó que VS no ejecutara las pruebas y el motor de ejecución de la prueba se bloqueó.
Lo archivé con Microsoft aquí (esto fue antes de obtener la solución correcta). connect.microsoft.com/VisualStudio/feedback/details/775868/vs-test-execution-crashes-in-vs-2012#details
De todos modos, las compilaciones ahora funcionan bien en teamcity. Aunque, todavía tengo curiosidad de por qué ninguno de los motores de ejecución de VS Test tenía una manera elegante de decirme qué estaba pasando, ni Team City.
Descubrí la causa raíz al depurar manualmente la prueba (que solo me di cuenta después de tantos días, la solución me llevó 5 segundos).
Esperemos que esto ayude a alguien que se encuentre con tales problemas.
fuente
Veo un problema similar, y usando el método de esta publicación: ( http://entityframework.codeplex.com/workitem/1590 ), que resuelve mi problema.
Para solucionar el problema, puede hacer que su ensamblaje de prueba haga referencia directamente al ensamblaje del proveedor agregando alguna línea como esta en cualquier parte del ensamblaje de prueba: var _ = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
fuente
Cuando inspeccioné el problema, noté que faltaban los siguientes dll en la carpeta de salida. La solución simple es copiar Entityframework.dll y Entityframework.sqlserver.dll con el archivo app.config a la carpeta de salida si la aplicación está en modo de depuración. Al mismo tiempo, cambie el parámetro de opción de compilación "Copiar a la carpeta de salida" de app.config para copiar siempre. Esto resolverá su problema.
fuente
Simplemente haga referencia o navegue el dll EF - EntityFramework.SqlServer.dll
fuente
Tuve el mismo problema que intenté muchas veces pero no se resolvió, pero cuando instalé el paquete EntityFramework.SqlServerCompact resolvió instalar este paquete desde Nuget Package Manager.
fuente
Creé un archivo estático de "inicio" y agregué el código para forzar la copia de la DLL en la carpeta bin como una forma de separar esta "configuración".
[DbConfigurationType(typeof(DbContextConfiguration))] public static class Startup { }
fuente
No quería una referencia a EF en mi proyecto de aplicación (o copiar nada manualmente), así que agregué esto a los eventos posteriores a la compilación de mi proyecto EF:
fuente
Esto solo ocurre dentro de mis proyectos de prueba de carga / unidad. Frustrante, simplemente tuve que surgir en un proyecto que he estado ejecutando durante 2 años. Debe haber sido un orden de prueba que rompe cosas. Supongo que una vez que se quita el fi se va.
Descubrí que simplemente declarar una variable que usa el valor correcto soluciona el problema ... Ni siquiera llamo al método. Solo defínalo. Extraño pero funciona.
fuente
Después de probar todas las otras soluciones sugeridas y no lograr que mi proyecto funcione, finalmente encontré un pequeño comentario en esta página :
Y funcionó para mí también.
fuente
Agregar Entityframework.dll y Entityframework.sqlserver.dll al proyecto de referencia resolvió el problema.
fuente
Verifiqué la ventana de salida de depuración en el proyecto de prueba unitaria. EntityFramework.SqlServer.dll no se cargó. Después de agregarlo a la carpeta bin, las pruebas se ejecutaron con éxito.
fuente
También tuve un problema similar
Mi problema se resolvió haciendo lo siguiente:
fuente
Tuve el mismo problema con el
DBContext
objeto Instantiating de un proyecto de prueba unitaria. Revisé mis paquetes de proyecto de prueba de unidad y pensé queEntityFramework
paquete no estaba instalado, lo instalé desde Nuget y solucioné el problema (creo que es un error de EF).codificación feliz
fuente
Acabo de recibir el mismo mensaje de error.
Tengo un proyecto separado para mi acceso a datos. Ejecutar el Proyecto web (que hacía referencia al proyecto de datos) localmente funcionó bien. Pero cuando implementé el proyecto web para azure el ensamblado: EntityFramework.SqlServer no se copió. Acabo de agregar la referencia al proyecto web y la redistribuí, ahora funciona.
espero que esto ayude a otros
fuente
Estaba trabajando en el tutorial de la Universidad de Contoso sin conexión y encontré el mismo problema al intentar crear mi primer controlador con EF. Tuve que usar Package Manager Console para cargar EF desde el caché nuget y creé una cadena de conexión a mi instancia local de SQL Server, mi punto aquí es que mi configuración de webConfig para EF puede no estar configurada como todos ustedes, pero pude para resolver mi problema eliminando completamente la sección "proveedores" dentro de "entityFramework"
Robert
fuente
Hay una solución fácil. abra las referencias en su proyecto, haga clic derecho en "System.Data" -> propiedades. Cambie "Copiar local" a "Verdadero".
El problema debe ser solucionado.
fuente
En mi caso, resolví el problema instalando SQL Server 2012 Developer Edition cuando había instalado previamente SQL Server Express 2012 (x64). Parece que me proporcionó la dependencia que falta.
fuente
elimine el marco de la entidad del proyecto a través de nuget y luego vuelva a agregarlo.
fuente
En mi caso
dll
no se copió aunque le agregué una referencia. Esto se debe aEntityFramework.SqlServer.dll
que no se copia en su proyecto. Agregue ese dll y con suerte funcionará. Puede encontrarlo en el proyecto donde agregó el modelo de datos.fuente
Además de todas las sugerencias útiles aquí, si está utilizando EF 6.1.3, asegúrese de que la versión .net de su proyecto sea 4.5 o más.
fuente