entity-framework - first - entity framework ventajas y desventajas




No se ha encontrado ningún proveedor de Entity Framework para el proveedor de ADO.NET con el nombre invariable 'System.Data.SqlClient' (20)

Después de descargar el EF6 de nuget e intentar ejecutar mi proyecto, devuelve el siguiente error:

No se ha encontrado ningún proveedor de Entity Framework para el proveedor de ADO.NET con el nombre invariable 'System.Data.SqlClient'. Asegúrese de que el proveedor esté registrado en la sección 'entityFramework' del archivo de configuración de la aplicación. Consulte http://go.microsoft.com/fwlink/?LinkId=260882 para obtener más información.


Añade esta función

private void FixEfProviderServicesProblem()

a la clase de contexto de la base de datos en la clase de la biblioteca y la DLL EntityFramework.SqlServer.dll faltante se copiarán en los lugares correctos.

namespace a.b.c
{
    using System.Data.Entity;

    public partial class WorkflowDBContext : DbContext
    {
        public WorkflowDBContext()
            : base("name=WorkflowDBConnStr")
        {
        }

        public virtual DbSet<WorkflowDefinition> WorkflowDefinitions { get; set; }
        public virtual DbSet<WorkflowInstance> WorkflowInstances { get; set; }
        public virtual DbSet<EngineAlert> EngineAlerts { get; set; }
        public virtual DbSet<AsyncWaitItem> AsyncWaitItems { get; set; }
        public virtual DbSet<TaskItem> TaskItems { get; set; }
        public virtual DbSet<TaskItemLink> TaskItemLinks { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
        }

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

.



Además, asegúrese de que el proyecto de inicio sea el proyecto que contiene su dbcontext (o app.config relevante). El mío estaba intentando iniciar un proyecto de sitio web que no tenía todos los ajustes de configuración necesarios.


Agregue a continuación a su app.config.

 <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>

Cuando el error ocurre en los proyectos de prueba, la solución más bonita es decorar la clase de prueba con:

[DeploymentItem("EntityFramework.SqlServer.dll")]

Cuando instala Entity Framework 6 a través de Nuget . EntityFramework.SqlServer alguna vez se pierde por otro ejecutable. Simplemente agrega el paquete Nuget a ese proyecto.

A veces lo anterior no funciona para Test Project

Para resolver este problema en el Proyecto de Prueba, simplemente coloque este Método dentro del Proyecto de Prueba:

public void FixEfProviderServicesProblem()
{
    var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
}

Nunca se ha llamado a este método, pero según mis observaciones, el compilador eliminará todos los ensamblajes "innecesarios" y, sin usar el EntityFramework.SqlServer la prueba falla.


El proyecto de inicio que hace referencia al proyecto donde se está utilizando Entity Framework necesita los siguientes dos ensamblajes en su carpeta bin:

  • EntityFramework.dll
  • EntityFramework.SqlServer.dll

Agregar una <section> a las <configSections> de <configSections> del archivo .config en el proyecto de inicio hace que el primer ensamblaje esté disponible en ese directorio bin. Puede copiar esto desde el archivo .config de su proyecto de Entity Framework:

<configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>

Para hacer que el segundo .dll esté disponible en la carpeta bin, aunque no sea práctico, se puede hacer una copia manual de la carpeta bin del proyecto Entity Framework. Una mejor alternativa es agregar al Proyecto de Entity Framework de Entity Framework las siguientes líneas, que automatizarán el proceso:

cd $(ProjectDir)
xcopy /y bin\Debug\EntityFramework.SqlServer.dll ..\{PATH_TO_THE_PROJECT_THAT_NEEDS_THE_DLL}\bin\Debug\

Eliminar la carpeta BIN lo hizo por mí


En mi caso, todo funcionó correctamente y luego, de repente, dejó de funcionar porque creo que Resharper alteró algunos cambios que causaron el problema. Mi proyecto se dividió en la capa de datos, el servicio y la capa de presentación. Tenía Entity Framework instalado y referenciado en mi capa de datos, pero aún así el error no desapareció. Desinstalar y reinstalar tampoco funcionó. Finalmente, lo resolví convirtiendo la capa de datos en el proyecto de Inicio, haciendo la migración, actualizando la base de datos y cambiando el proyecto de Inicio a mi capa de presentación .


Expanda el archivo YourModel.edmx y abra la clase YourModel.Context.cs en YourModel.Context.tt.

Agregué la siguiente línea en la sección de uso y el error fue corregido para mí.

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

Es posible que deba agregar esta línea al archivo cada vez que se genere automáticamente.


Me acabo de encontrar con este problema hoy. Tengo una biblioteca de clases de repositorio de datos con el paquete EF63 NuGet y la aplicación de consola para pruebas, que hacen referencia solo al proyecto de biblioteca de clases. Creé un comando posterior a la compilación muy simple, que copia EntityFramework.SqlServer.dll desde la carpeta Bin \ Debug de la biblioteca de clases a la carpeta Bin \ Debug de la aplicación de la consola y el problema se resolvió. No olvide agregar la sección entityFramework al archivo .config de la aplicación de consola.


Ninguno de estos funcionó para mí. Encontré la solución en otra pregunta de . Lo agregaré aquí para una fácil referencia:

Debe hacer una referencia, por lo que se copiará en la ruta de la aplicación den. Porque más adelante se hará referencia en tiempo de ejecución. Así que no necesitas copiar ningún archivo.

private volatile Type _dependency;

public MyClass()
{
    _dependency = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
}

Nota: tuve este problema al generar la base de datos SQL desde el modelo. Había creado todas las tablas bien pero no exportaría los cambios. Lo que debe tener en cuenta es que este error se genera cuando intenta exportar el sql utilizando la plantilla de generación DDL como SSDLtoSQL10. Aquí se espera la conexión de MySQL, así que asegúrese de seleccionar de la plantilla de generación de DDL desplegable SSDLtoMySQL en las propiedades del modelo. ¡Pasé un día entero en esto!


Probé casi todo lo anterior y nada funcionó.

Solo cuando establecí los archivos DLL a los que se hace referencia en las propiedades EntityFramework y EntityFramework.SqlServer proyecto predeterminado, Copy Local to True , ¡comenzó a funcionar!


Se encontró con este problema hoy cuando trabaja con un conjunto de servicios web, cada uno en diferentes proyectos, y un proyecto separado que contiene pruebas de integración para algunos de esos servicios.

He estado usando esta configuración durante algún tiempo con EF5, sin necesidad de incluir referencias a EF del Proyecto de prueba de integración.

Ahora, después de actualizar a EF6, parece que necesito incluir una referencia a EF6 en el proyecto de prueba de integración también, aunque no se use allí (más o menos como lo señaló anteriormente el user3004275 ).

Indicaciones de que estás enfrentando el mismo problema:

  • Las llamadas directamente a EF (conectarse a una base de datos, obtener datos, etc.) funcionan bien, siempre y cuando se inicien desde un proyecto que tenga referencias a EF6.
  • Las llamadas al servicio a través de una interfaz de servicio publicada funcionan bien; Es decir, no hay referencias faltantes "internamente" en el servicio.
  • Las llamadas directamente a los métodos públicos en el proyecto de servicio, desde un proyecto fuera del servicio, causarán este error, incluso si EF no se utiliza en ese proyecto en sí; Solo internamente en el proyecto llamado.

El tercer punto es lo que me echó por un tiempo, y todavía no estoy seguro de por qué esto es necesario. La adición de una referencia a EF6 en mi proyecto de Prueba de integración lo resolvió en cualquier caso ...


También puede ver este mensaje si olvida incluir "EntityFramework.SqlServer.dll".

Parece ser un archivo recién agregado en EF6. Inicialmente, no lo había incluido en mi módulo de combinación y me encontré con el problema enumerado aquí.


Tenía una aplicación de consola y una biblioteca de clases. En la biblioteca de clases, creé Entity Data Model (haga clic con el botón derecho en Class Library> Add> New Item> Data> ADO.NET Entity Data Model 6.0) y coloqué la referencia en la aplicación de la consola. Entonces, tiene una aplicación de consola que tiene referencia a la biblioteca de clases y dentro de la biblioteca de clases tiene el modelo EF. Tuve el mismo error cuando intenté obtener algunos registros de la tabla.

Resolví este problema siguiendo estos pasos:

  1. Haga clic con el botón derecho en la solución y elija la opción 'Administrar paquetes de NuGet para la solución' y aparecerá la ventana del administrador de paquetes de NuGet.
  2. Vaya a la opción 'Administrar' en 'Paquetes instalados' SUGERENCIA: Entity Framework se agrega a Class Library, por lo que tendrá EntityFramework en 'Paquetes instalados' y verá la opción 'Administrar'
  3. Haga clic en la opción 'Administrar' y marque para instalar el paquete en el proyecto que tiene referencia a la biblioteca de clases que contiene el modelo EF (en mi caso, puse la casilla de verificación para instalar el paquete en la aplicación de consola que tenía referencia a la biblioteca de clases que tenía un modelo EF en su interior)

Eso es todo lo que tenía que hacer y todo funcionó a la perfección.

Espero que haya ayudado.


Tuve el mismo problema, solo copié el archivo de configuración de la aplicación del proyecto que contenía el DBContext a mi proyecto de prueba


Tuve un problema relacionado al migrar desde una base de datos de CE a Sql Server en Azure. Solo desperdicié 4 horas tratando de resolver esto. Esperemos que esto pueda salvar a alguien un destino similar. Para mí, tenía una referencia a SqlCE en mi archivo packages.config. Eliminarlo resolvió todo mi problema y me permitió usar migraciones. Yay Microsoft para otra tecnología con problemas de configuración y configuración innecesariamente complejos.


Yo tengo el mismo error. Es extraño que solo suceda cada vez que use mi dbContext para consultar a cualquiera de mi modelo u obtener su lista como:

var results = _dbContext.MyModel.ToList();

Intentamos volver a instalar el Entity Framework, hacer referencia a él correctamente pero fue en vano.

Afortunadamente, intentamos verificar las soluciones de Nuget para ALL , luego actualizar todo o asegurarnos de que la versión sea la misma porque notamos que los dos proyectos tienen diferentes versiones de EF en el proyecto web. Y funciona. El error se ha ido.

Aquí está la captura de pantalla de cómo administrar Nuget para todas las soluciones:





entity-framework