ASP.NET 5の複数のdbcontext問題

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

質問

私は2つのdbcontextを持っているとき、新しいASP.NET 5のベータ8と問題を抱えて遊んでいる。

私は以下のプロジェクト構造を持っています。

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

WebAppのStartup.csにいくつかのコードを削除

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

ResourceDbContextとDatabaseContextの両方で、私は次のことを行います

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


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

しかし、私がappsettings.jsonから接続文字列を読み込むと、ConfigureServicesに正しい値が返されます。しかし、DbContextOptionsには最新のロードされた値のみが含まれています。この場合、リソースの接続文字列が含まれています。したがって、dbcontextは両方ともResource dbへの接続を確立します。

私はこれに関する情報を見つけることができません。

受け入れられた回答

DbContextOptionsがジェネリック型であることを示すだけです。

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

}

これで、依存関係注入システムは、ResourceDbContextを作成してコンストラクタに注入する時点で、適切な依存関係( DbContextOptions options )を見つけることができます。

実装のAddDbContextメソッドを参照してください。


ミロスラフ・シスカの場合:

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

    }        
}

人気のある回答

大きな助けをありがとう!

完全なソリューション:

  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はDbContextとUserManagerをコントローラに注入するために働いています。複数のデータベースにログインして登録することができます。ここで接続文字列を挿入する方法のみを確認する必要があります:this._connectionString = "Connection String";しかし、それは簡単です...もう一度ありがとう!



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ