c# - neutral - no se pueden cargar los recursos de metadatos especificados. entity framework




¿El tipo Entity Framework Provider no se pudo cargar? (20)

Acabo de tener el mismo mensaje de error.

Tengo un proyecto separado para mi acceso a datos. La ejecución del Proyecto Web (que hizo referencia al proyecto de datos) funcionó bien localmente. Pero cuando implementé el proyecto web para crear un ensamblaje azul: EntityFramework.SqlServer no se copió. Acabo de agregar la referencia al proyecto web y la redistribuí, ahora funciona.

espero que esto ayude a otros

Estoy intentando 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 ' El proveedor de ADO.NET no pudo ser cargado. 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 a System.Data.Entity en ninguno de mis proyectos como se sugirió en codeplex para actualizar a EF6.

Entonces, no estoy seguro de por qué estoy recibiendo esta excepción. No obtengo ninguna excepción de este tipo cuando ejecuto las pruebas de VS.

Intenté establecer CopyLocal en false y luego nuevamente en true ... pero eso tampoco parece funcionar.

Actualizar

Mi app.config tiene lo siguiente. ¿Causa esto 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

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.


Cuando inspeccioné el problema, noté que faltaban las siguientes dll en la carpeta de salida. La solución simple es copiar Entityframework.dll y Entityframework.sqlserver.dll con 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 en la carpeta de salida" de app.config para copiar siempre. Esto resolverá tu problema.


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 :

Eliminar la carpeta BIN lo hizo por mí

Y funcionó para mí también.

Ahora no puedo saber si solo tiene que eliminar la carpeta bin y ya funcionará o si primero tendrá que hacer las cosas que han sugerido los otros desarrolladores, pero el punto es que solo lo puse en funcionamiento después de eliminar el bin, y esto después de 3 o más horas buscando y probando otras soluciones. Entonces, tal vez funcione para ti también.


En mi caso, dll no fue copiado aunque le agregué una referencia. Esto se debe a que EntityFramework.SqlServer.dll no se copia en su proyecto. Agregue esa dll y con suerte funcionará. Puede encontrarla en el proyecto donde agregó datamodel.


En mi caso, resolví el problema al instalar SQL Server 2012 Developer Edition cuando había instalado anteriormente SQL Server Express 2012 (x64). Parece que me proporcionó la dependencia faltante.


Esto solo ocurre dentro de mis proyectos de pruebas de carga / unidad. Frustrante, creo que surgió en un proyecto que he estado ejecutando durante 2 años. Debe haber habido algún orden de ejecución de prueba que rompa las cosas. Supongo que una vez que se quita el fi se ha ido.

Descubrí que la simple declaración de una variable que usa el valor correcto soluciona el problema ... Nunca llamé al método. Sólo defínelo. Raro pero funciona.

    /// <summary>
    /// So that the test runner copies dlls not directly referenced by the integration project
    /// </summary>
    private void referenceLibs()
    {
        var useless = SqlProviderServices.Instance;
    }

Finalmente resolví esto. Resulta que tuve una implementación errónea de IDIsposable en mi clase de repositorio. Arreglé eso. La implementación errónea provocó una excepción de 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 presenté a 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. Sin embargo, todavía siento curiosidad por el hecho de que ninguno de los dos motores de ejecución de VS Test tenía una manera elegante de decirme lo que estaba sucediendo, no Team City.

Descubrí la causa raíz mediante la depuración manual de la prueba (que solo me di cuenta después de tantos días, la solución me tomó 5 segundos).

Esperemos que esto ayude a alguien que se encuentre con tales problemas.


He utilizado el registro basado en código para el proveedor. link1 link2

Acaba de crear la clase de configuración como

class DbContextConfiguration : DbConfiguration
{
    public DbContextConfiguration()
    {
        this.SetDatabaseInitializer(new DropCreateDatabaseAlways<MyDbContext>());
        this.SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
    }
}

El punto clave es this.SetProviderServices (SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);

y lo usé de tal manera

[DbConfigurationType(typeof(DbContextConfiguration))]
public class MyDbContext : DbContext
{
    public MyDbContext()
    {
        ...
    }

    public DbSet<...> ...{ get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        ...
    }
}

La solución del problema al agregar Entityframework.dll y Entityframework.sqlserver.dll al proyecto de referencia.


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


Mismo problema, pero instalé EF 6 a través de Nuget. Falta EntityFramework.SqlServer para otro ejecutable. Simplemente agregué el paquete nuget a ese proyecto.


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 los proyectos que hacen referencia a su proyecto EF6. Creo que esto se debe a que Visual Studio es lo suficientemente "inteligente" para detectar que nada en su ensamblaje está usando 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 usa 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, 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://.com/a/22315164/1141360.
    private static SqlProviderServices instance = SqlProviderServices.Instance;
}

Resolví esto agregando un elemento de uso en la parte superior de mi clase DBContext, así:

using SqlProviderServices= System.Data.Entity.SqlServer.SqlProviderServices;

Simplemente haga referencia o busque en el navegador la dll EF - EntityFramework.SqlServer.dll


También tuve un problema similar.

Mi problema se resolvió haciendo lo siguiente:


Tengo un problema, porque no agrego referencia a EntityFramework.sqlServer.dll. Cuando desarrollo un programa, funciona. Pero cuando publico la aplicación y la instalo, arroja un error.

Acabo de agregar referencia y construir y publicar de nuevo.


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:

El proveedor de Entity Framework tipo 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' para el 'System.Data.SqlClient' proveedor de 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.

Mi solución: 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;
}

Nunca se ha llamado a este método, pero creo que el compilador eliminará todos los ensamblados "innecesarios" y, sin usar 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 asegurar una referencia estática a SqlProviderServices desde su proyecto de modelo / entidad .


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 conjunto de prueba haga referencia directa al conjunto del proveedor agregando alguna línea como esta en cualquier lugar del conjunto de prueba: var _ = System.Data.Entity.SqlServer.SqlProviderServices.Instance;


elimine el marco de la entidad del proyecto a través de nuget y luego vuelva a agregarlo.





entity-framework-6