Nessun provider di database è configurato EF7

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

Domanda

Mi sembra di ricevere questo messaggio di errore quando utilizzo Entity Framework 7 e MVC6

System.InvalidOperationException Nessun provider di database è configurato. Configurare un provider di database eseguendo l'override di OnConfiguring nella classe DbContext o nel metodo AddDbContext durante l'impostazione dei servizi.

Credo di aver fatto tutto ciò che dovrei fare, quindi forse è un bug. Sto usando la versione 7.0.0-beta7 di Entity Framework.

Ho configurato il mio DbContext, un'interfaccia in modo da poter prendere in giro DbContext (era necessario in EntityFramework 6 per il test delle unità). I miei servizi prendono l'interfaccia come costruttore e ho impostato DI in MVC 6.

Nel mio file Startup.cs ho il seguente

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

Ho controllato il mio connectionString e questo sta restituendo una connessione valida. Ho anche controllato nel mio servizio che l'oggetto è stato iniettato, e non è nullo, quindi dovrebbe funzionare.

Il mio file config.json ha questo aspetto

{
    "Data": {
        "MyConnection": {
            "ConnectionString": "Server=(local);Database=XXXX;Trusted_Connection=True;"
        }
    }
}

Il mio DbContext non sovrascrive il metodo OnConfiguring, perché ritengo che non sia necessario poiché sto facendo tutto come sopra? Ho ragione? Cosa mi manca? Guardato un sacco di diversi siti web, credo che alcuni stanno usando il vecchio codice, perché alcuni metodi non esistono e altri siti web hanno lo stesso di quello che ho.

Risposta accettata

Imposta il tuo MyDbContext mostrato di seguito per iniettare il parametro delle opzioni definito nella chiamata a Startup.cs AddDbContext ().

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

Ciò consentirà di passare la stringa di connessione dalla configurazione (config.json) alle opzioni di chiamata del metodo. UseSqlServer ()

services.AddEntityFramework()
    .AddSqlServer()
    .AddDbContext<MyDbContext>(options => options.UseSqlServer(Configuration["Data:MyConnection:ConnectionString"]));

Ho incontrato lo stesso problema quando ho dovuto dividere la mia soluzione in progetti separati Web, BL e DAL.


Risposta popolare

Credo che questo errore si sia verificato sulla linea in cui si sta tentando di accedere ad alcuni dati dal database. Puoi risolvere questo problema confondendo il tuo contesto. Basta sovrascrivere il metodo 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)
    {
        ...
    }
}



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché