我正在使用新的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)。

See implementation AddDbContext method



对于Miroslav Siska:

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

    }
}

10-07 21:09