ASP.NET 5 più problemi di dbcontext

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

Domanda

Sto giocando con il nuovo ASP.NET 5 beta 8 e ho problemi quando ho due dbcontext.

Ho la seguente struttura di progetto.

-Data(Identity 3 db with other entities)
-Resources (Contains a db with translations)
-WebApp 

Strippato un po 'di codice in Startup.cs in WebApp

 public void ConfigureServices(IServiceCollection services)
 {
        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<DatabaseContext>(opt => opt.UseSqlServer(Configuration["Data:MainDb:ConnectionString"]));

        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<DatabaseContext>()
            .AddDefaultTokenProviders();

        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<ResourceDbContext>(opt => opt.UseSqlServer(Configuration["Data:Resources:ConnectionString"]));

        services.AddTransient<IResourceDbContext, ResourceDbContext>();
        services.AddTransient<IDatabaseContext, DatabaseContext>();
}

Sia in ResourceDbContext che in DatabaseContext faccio quanto segue

    public ResourceDbContext(DbContextOptions options) : base(options)
    {
        _connectionString = ((SqlServerOptionsExtension)options.Extensions.First()).ConnectionString;
    }


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

Tuttavia, quando leggo le mie stringhe di connessione da appsettings.json, ricevo i valori corretti in ConfigureServices. Ma DbContextOptions contiene solo l'ultimo valore caricato, in questo caso il connectiontring per le risorse. Quindi, sia dbcontext stabilisce una connessione a db risorsa.

Non riesco a trovare alcuna informazione a riguardo.

Risposta accettata

Tutto quello che devi fare è indicare che DbContextOptions è un tipo generico:

public ResourceDbContext(DbContextOptions<ResourceDbContext> options) : base(options)
{

}

Ora il sistema di iniezione delle dipendenze può trovare la giusta dipendenza ( DbContextOptions options ) nel momento in cui crea ResourceDbContext e lo inietta nel costruttore.

Vedere il metodo di implementazione AddDbContext


Per Miroslav Siska:

public class GetHabitsIdentity: IdentityDbContext<GetHabitsUser, IdentityRole, string> where TUser : IdentityUser
{
    public GetHabitsIdentity(DbContextOptions<GetHabitsIdentity> options)
        :base(options)
    {

    }        
}

Risposta popolare

Grazie per il grande aiuto !!!

Soluzione completa:

  public class TenantDbContext : IdentityDbContext<ApplicationUser, IdentityRole, string>
{
    private string _connectionString { get; set; }  

    public TenantDbContext(DbContextOptions<TenantDbContext> options) : base(options)  
    {
        this._connectionString = "Connection String";
    }

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

ASP.NET 5 DI funziona per l'iniezione di DbContext e UserManager sul controller. Ora è possibile accedere e registrarsi con più database ... Ora ho solo bisogno di controllare come inserire la stringa di connessione qui: this._connectionString = "Connection String"; Ma è semplice ... Grazie ancora!



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é