如果通过DBContext的构造函数直接注入HttpContext是,获取的是Null,
可以注入一个IServiceProvider,然后获取IHttpContextAccessor就可以取到HttpContext了
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
var httpContext=serviceProvider.GetRequiredService<IHttpContextAccessor>().HttpContext;
/*
通过具体操作取到connStr
*/
optionsBuilder.UseSqlServer(connStr);
}
这是我一直用于多租户解决方案(客户拥有自己的数据库)的方法。
使用此构造函数签名创建上下文(不需要OnConfiguring
):
public class MyDbContext : DbContext
{
public MyDbContext(DbContextOptions<MyDbContext> options)
: base(options) { }
}
在您的 Startup 中,您需要注册您的上下文,我们现在可以添加一个解析器来获取正确的连接设置:
services.AddHttpContextAccessor();
services.AddDbContext<MyDbContext>();
// This registers DbContextOptions<MyDbContext> which will be called when a new
// instance of MyDbContext is created. You could set breakpoints in this method.
services.AddScoped(sp =>
{
var context = sp.GetRequiredService<IHttpContextAccessor>().HttpContext;
// your logic to determine connection string or EF provider
// ...
var builder = new DbContextOptionsBuilder<MyDbContext>();
builder.UseSqlServer("connection string");
return builder.Options;
});