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