Più dbContexts in ASP.NET vNext e EF7

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

Domanda

Sto cercando di andare avanti con la creazione di sistemi web con ASP.NET vNext utilizzando MVC 6 e EF7. Sto guardando questo tutorial: http://stephenwalther.com/archive/2015/01/17/asp-net-5-and-angularjs-part-4-using-entity-framework-7

Nella pagina vedrai come aggiungere un dbContext ad un progetto ed è registrato nel file di avvio in questo modo:

// Register Entity Framework
services.AddEntityFramework(Configuration)
        .AddSqlServer()
        .AddDbContext<MoviesAppContext>();

E la classe di contesto si presenta così:

public class MoviesAppContext:DbContext
{
    public DbSet<Movie> Movies { get; set; }
}

Funziona tutto bene, ma ora ho bisogno di aggiungere un altro DbContext. Anche se non so come registrare questo contesto aggiuntivo in modo che sia usato da EF e possa essere usato nel mio progetto.

Diciamo che ho creato un nuovo contesto come questo:

public class MyNewSuper:DbContext
{
    public DbSet<Model1> Model1 { get; set; }
    public DbSet<Model2> Model2 { get; set; }
}

Come posso procedere quindi a registrarlo per l'utilizzo nel mio progetto?

Risposta popolare

Nota importante: la sintassi per la configurazione dei servizi di Entity Framework 7 è cambiata da questo post, che era accurato a partire dagli ultimi beta round. La stessa idea dovrebbe comunque applicarsi alla nuova sintassi.

Ecco cosa ho fatto:

services.AddEntityFramework().AddSqlServer()
                .AddDbContext<DataContextA>(options => options.UseSqlServer(Configuration.Get("StorageSettings:SQLConnectionString")))
                .AddDbContext<DataContextB>(options => options.UseSqlServer(Configuration.Get("StorageSettings:SQLConnectionString")));

dove StorageSettings:SQLConnectionString è una stringa di connessione per un database SQL Express. Attualmente, ho sia DataContextA che DataContextB condividono lo stesso database, ma puoi tenerli separati. Se vuoi continuare ad usare il metodo di Configuration (di cui non ero a conoscenza, piuttosto interessante!) Potresti fare qualcosa del genere:

{
    "Data": {
        "DefaultConnectionA": { 
            "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=ContextADatabase;Trusted_Connection=True;MultipleActiveResultSets=true",
        "DefaultConnectionB": { 
            "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=ContextBDatabase;Trusted_Connection=True;MultipleActiveResultSets=true"
        }
    },
    "EntityFramework": {
        "DataContextA": {
            "ConnectionStringKey": "Data:DefaultConnectionA:ConnectionString"
        }            
        "DataContextB": {
            "ConnectionStringKey": "Data:DefaultConnectionB:ConnectionString"
        }
    }
}

con

services.AddEntityFramework(Configuration)
                .AddSqlServer()
                .AddDbContext<DataContextA>()
                .AddDbContext<DataContextB>();

Sia DataContextA che DataContextB possono essere iniettati nel controller:

public class MyController: Controller {
    public MyController(DataContextA dataA, DataContextB dataB) {
        // Do stuff
    }
}


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é