7

Il mio problema è che il codice seguente non registra un archivio dati durante l'avvio. Questa è la specifica "errore" dichiarazione ottengo nella risposta dall'applicazione:Aggiunta di DbContextOptions in Startup.cs non registrazione dell'archivio dati

An unhandled exception occurred while processing the request. 

InvalidOperationException: No data stores are configured. Configure a data store by overriding OnConfiguring in your DbContext class or in the AddDbContext method when setting up services. 
    Microsoft.Data.Entity.Storage.DataStoreSelector.SelectDataStore(ServiceProviderSource providerSource) 

In ConfigureServices (servizi IServiceCollection) Sto cercando di specificare DbContextOptions per il mio DbContext in un lambda. Codice:

services.AddEntityFramework(Configuration) 
    .AddSqlServer() 
    .AddDbContext<MyDbContext>(
     options => 
     options.UseSqlServer(Configuration.Get("Data:DefaultConnection:ConnectionString")) 
    ); 

Nel mio DbContext, ho un costruttore che invia l'opzione alla base, il codice:

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

mio config.json file di configurazione, che viene letto all'avvio, contiene questa connectionstring:

"Data": { 
    "DefaultConnection": { 
     "ConnectionString": "Server=(localdb)\\MSSQLLocalDB;Database=MyDbName;Trusted_Connection=True;MultipleActiveResultSets=True;" 
    } 
} 

ho usato in precedenza

protected override void OnConfiguring(DbContextOptions options) 
{ 
    options.UseSqlServer(Startup.Configuration.Get("Data:DefaultConnection:ConnectionString")); 

} 

nel mio DbContext con successo. Registra l'archivio dati e funziona correttamente, ma preferirei usare la modalità lambda.

Se sono necessarie ulteriori informazioni, le fornirò.

+0

Sì, sembra il modo Lambda non funziona correttamente in beta 4, Sto avendo lo stesso problema quando si cerca di eseguire migrazioni –

+0

@RonDeFreitas Sì, sono su beta3 in questo momento, ma credo di devi solo aspettare fino a quando non lo risolvono, ho solo pensato che fosse strano che EF 7 su github avesse il modo lambda come esempio su come impostare DbContextOptions. Grazie a proposito, bello sapere che non sono solo in questa faccenda. – DanielRJ

risposta

5

Stai iniettando il tuo contesto nel tuo controller o ovunque lo usi? Ho scoperto che se si tenta di aggiungere il contesto invece di iniettarlo, non utilizza la configurazione specificata in Startup.cs

+0

Sto iniettando il mio DbContext. Quindi, non è così tristemente. – DanielRJ

+0

Wierd ... questo è il mio contesto in beta4 e sta funzionando benissimo services.AddEntityFramework() .AddSqlServer() .AddDbContext (Opzioni => options.UseSqlServer (Configurazione [ "Data: DefaultConnection: ConnectionString" ])); – Slick86

+0

Grazie per la condivisione, ci proverò domani. Inoltre, eseguirò l'aggiornamento alla versione beta4, se non sarà una seccatura. Iniziato con beta2, e l'aggiornamento è stato doloroso tra 2 e 3. Migrazioni e ridenominazione di classe in Microsoft.MVC, non è divertente. Ti farò sapere come è andata domani. – DanielRJ

1

I (ancora) hanno lo stesso problema con EF7 e beta 4. Questa è la mia soluzione alternativa in il mio contesto dati:

public class AspNetDataContext : IdentityDbContext, IDataContext 
{ 
    private readonly string _connectionString; 
    public DbSet<Player> Players { get; set; } 

    public AspNetDataContext(DbContextOptions options) 
    { 
     _connectionString = ((SqlServerOptionsExtension)options.Extensions.First()).ConnectionString; 
    } 

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
    { 
     optionsBuilder.UseSqlServer(_connectionString); 
    } 
} 

ho estrarre il connectionstring dalle opzioni e utilizzare questo nel metodo OnConfiguring. Questa non è ancora la soluzione che vogliamo, ma non devo modificare qualcosa in Startup.cs (tutto ciò che è come descritto). E non appena viene risolto, devi solo rimuovere la roba dalla classe di contesto dei dati. E forse qualcuno ha un'altra (e anche migliore) soluzione a questo problema.

+0

Che dire di beta5? –

-1

EF7 ha una nuova sillaba da DBContextOptionsBuilder a EntityOptionsBuilder. Di seguito è pronto per l'uso anche per il ponteggio a linea di comando.

public class ContentContext : DbContext 
{ 
    public DbSet<Content> Contents { get; set; } 
    public DbSet<ContentCategory> ContentCategories { get; set; } 

    protected override void OnConfiguring(EntityOptionsBuilder optionsBuilder) 
    { 
     optionsBuilder.UseSqlServer("Data:DefaultConnection:ConnectionString"); 
    } 
}