13

mi sembra di essere sempre questo messaggio di errore quando si utilizza Entity Framework 7 e MVC6Nessun provider di database sono configurati EF7

System.InvalidOperationException Nessun provider di database sono configurati. Configurare un provider di database ignorando OnConfiguring nella classe DbContext o nel metodo AddDbContext quando si impostano i 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 dell'unità). I miei servizi prendere l'interfaccia come un costruttore e ho installato DI MVC 6.

Nei miei Startup.cs File 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 che sta tornando 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 assomiglia a questo

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

mio DbContext non l'override del metodo OnConfiguring, perché credo che non è necessario come 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.

+0

Come si sta creando il 'MyDbContext' in codice? – DavidG

risposta

26

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

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

Questo vi permetterà di passare la stringa di connessione dalla configurazione (config.json) nella options.UseSqlServer chiamata al metodo()

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.

+0

Perfetto! Grazie – Gillardo

+0

Se vuoi prendere in giro DbContext non hai bisogno di un'interfaccia.Basta creare il DbSet virtuale in modo da poterli prendere in giro. Presumo che tu non voglia simulare il contesto. Database o context.Configurazione e testare il framework delle entità ;-) – Pascal

+0

Come istanziare MyDbContext nel Controller o ovunque sia necessario utilizzarlo? –

4

I belive che ti ha colpito questo errore sulla riga in cui si tenta 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) 
    { 
     ... 
    } 
} 
1

provare quanto segue:

public class DataContext<TEntity> : DbContext where TEntity : class 
{ 

    private TEntity _entity = null; 
    public DataContext() 
     : base() 
    { 

    } 
    public DataContext(TEntity entity) 
    { 
     this._entity = entity; 
    } 
    public DbSet<TEntity> Entity { get; set; } 


    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 
     modelBuilder.HasDefaultSchema("dbo"); 

    } 

    public IConfigurationRoot Configuration { get; set; } 

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
    { 
     var configuration = new ConfigurationBuilder() 
       .AddJsonFile("appsettings.json"); 
     Configuration = configuration.Build(); 
     optionsBuilder.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]); 
    } 
}