我正在玩新的ASP.NET 5 beta 8,當我有兩個dbcontext時遇到麻煩。

我有以下項目結構。

-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只包含最新加載的值,在本例中是Resources的連接字符串。所以dbcontext都建立了與Resource db的連接。

我無法找到任何有關此信息。

一般承認的答案

您需要做的就是指示DbContextOptions是泛型類型:

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

}

現在,依賴注入系統可以在創建ResourceDbContext並將其註入構造函數時找到正確的依賴項( DbContextOptions options )。

請參閱實現AddDbContext方法


對於Miroslav Siska:

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
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow