No hay proveedores de bases de datos configurados EF7

asp.net-core asp.net-core-mvc c# entity-framework entity-framework-core

Pregunta

Parece que estoy recibiendo este mensaje de error cuando uso Entity Framework 7 y MVC6

System.InvalidOperationException No hay proveedores de bases de datos configurados. Configure un proveedor de base de datos anulando OnConfiguring en su clase DbContext o en el método AddDbContext al configurar los servicios.

Creo que he hecho todo lo que se supone que debo hacer, así que tal vez sea un error. Estoy usando la versión 7.0.0-beta7 de Entity Framework.

He configurado mi DbContext, una interfaz para que pueda simular DbContext (se necesitaba en EntityFramework 6 para pruebas de unidad). Mis servicios toman la interfaz como un constructor y tengo la configuración DI en MVC 6.

En mi archivo Startup.cs tengo los siguientes

public void ConfigureServices(IServiceCollection services)
{
    // entity framework
    services.AddEntityFramework()
        .AddSqlServer()
        .AddDbContext<MyDbContext>(options =>
            options.UseSqlServer(Configuration["Data:MyConnection:ConnectionString"])
        );

    // Add MVC services to the services container.
    services.AddMvc();

    // new context on each request
    services.AddScoped<IMyDbContext, MyDbContext>();
}

He comprobado mi connectionString y eso está devolviendo una conexión válida. También he comprobado en mi servicio que el objeto se está inyectando, y no es nulo, por lo que todo debería funcionar.

Mi archivo config.json se ve así

public void ConfigureServices(IServiceCollection services)
{
    // entity framework
    services.AddEntityFramework()
        .AddSqlServer()
        .AddDbContext<MyDbContext>(options =>
            options.UseSqlServer(Configuration["Data:MyConnection:ConnectionString"])
        );

    // Add MVC services to the services container.
    services.AddMvc();

    // new context on each request
    services.AddScoped<IMyDbContext, MyDbContext>();
}

Mi DbContext no anula el método OnConfiguring, porque creo que no es necesario ya que lo estoy haciendo todo como se indica arriba. Estoy en lo cierto? ¿Qué me estoy perdiendo? Miré muchos sitios web diferentes, supongo que algunos están usando código antiguo, porque algunos métodos no existen y otros sitios web tienen lo mismo que yo.

Respuesta aceptada

Configure su MyDbContext que se muestra a continuación para inyectar el parámetro de opciones definido en la llamada de Startup.cs AddDbContext ().

public MyDbContext(DbContextOptions options)
: base(options)
{ }

Esto le permitirá pasar su cadena de conexión de la Configuración (config.json) a las opciones de llamada de método.UseSqlServer ()

public MyDbContext(DbContextOptions options)
: base(options)
{ }

Encontré el mismo problema cuando tuve que dividir mi solución en proyectos separados Web, BL y DAL.


Respuesta popular

Creo que has cometido este error en la línea en la que intentas acceder a algunos datos de la base de datos. Puedes resolver este problema configurando tu contexto. Simplemente anule el método OnConfiguring.

public class MyDbContext : DbContext
{
    public DbSet<Employee> Employees { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
        options.UseSqlServer("<your connection string>");
    }

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



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué