¿No se pudo cargar el tipo de proveedor de Entity Framework?

Resuelto ashutosh raina asked hace 11 años • 34 respuestas

Estoy intentando ejecutar mis pruebas en TeamCity que está actualmente instalado en mi máquina.

System.InvalidOperationException:

El tipo de proveedor de 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 ensamblado 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.Entityen ninguno de mis proyectos como se sugirió en codeplex para actualizar a EF6.

Entonces, no estoy seguro de por qué recibo esta excepción. No obtengo ninguna excepción de este tipo cuando ejecuto las pruebas desde 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 seguimiento de pila 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
ashutosh raina avatar Dec 26 '12 01:12 ashutosh raina
Aceptado

El 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.

Narcis avatar Mar 12 '2013 10:03 Narcis

Tuve el mismo problema en mis proyectos de prueba: instalé los últimos bits de EF6 a través de NuGet y cada vez que invoco algo relacionado con EF obtengo:

No se pudo cargar el tipo de proveedor de Entity Framework 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' para el proveedor ADO.NET 'System.Data.SqlClient'. Asegúrese de que el ensamblado 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.

Mi solución alternativa: coloqué este método dentro de mi proyecto de prueba:

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

Este método nunca se ha llamado, pero creo que el compilador eliminará todos los ensamblados "innecesarios" y, sin utilizar EntityFramework.SqlServer, la prueba falla.

De todos modos: funciona en mi máquina;)

Nota: En lugar de agregar el método al proyecto de prueba, puede garantizar una referencia estática a SqlProviderServices desde su proyecto de modelo/entidad .

Robert Muehsig avatar Oct 02 '2013 05:10 Robert Muehsig

Nuget configurará su proyecto EF6 para que haga referencia a EntityFramework.SqlServer.dll. Esto se implementa en la carpeta de salida de su proyecto EF6 durante la compilación, pero no se implementará en la carpeta de salida de los proyectos que hacen 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 ensamblaje usa la dll directamente y, por lo tanto, no la incluye. Puede forzar la implementación de EntityFramework.SqlServer.dll en la carpeta de salida de los proyectos que hacen referencia a su proyecto EF6 (pruebas unitarias, UI, etc.) agregando código a su proyecto EF6 que use EntityFramework.SqlServer.dll. Tenga cuidado de no colocar 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 ensamblaje, lo que solucionó el problema.

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;
}
Timothy Schoonover avatar Mar 11 '2014 02:03 Timothy Schoonover

Mi solución fue eliminar el marco de la entidad del proyecto a través del administrador nuget y volver a agregarlo.

Kevbo avatar Feb 06 '2015 16:02 Kevbo

Resolví esto agregando una declaración de uso encima de mi clase DBContext, así:

using SqlProviderServices= System.Data.Entity.SqlServer.SqlProviderServices;
mmttato avatar Dec 27 '2015 18:12 mmttato