Я столкнулся с почти такой же проблемой с твоей. У меня есть один TenantDbContext.
public class TenantDbContext : DbContext
{
private readonly Tenant _tenant;
public DbSet<Branch> Branches { get; set; }
public TenantDbContext(DbContextOptions<TenantDbContext> options, IHttpContextAccessor httpContextAccessor)
: base(options)
{
if (httpContextAccessor.HttpContext != null)
{
_tenant = (Tenant)httpContextAccessor.HttpContext.Items["TENANT"];
}
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (_tenant != null)
{
optionsBuilder.UseSqlServer(_tenant.ConnectionString);
}
base.OnConfiguring(optionsBuilder);
}
}
Затем я обнаружил, что «Add-Migration» трудно с помощью консоли диспетчера пакетов, потому что строка подключения является динамической c, поэтому я создал заполнитель («Dev ") для строки подключения, в Startup.ConfigureServices ()
var devConnectionString = _config.GetConnectionString("Dev");
services.AddDbContext<TenantDbContext>(opt => opt.UseSqlServer(devConnectionString));
Вы знаете, есть два способа настройки DbContext, как показано в двух фрагментах кода выше соответственно. Если оба они указаны, сначала будет вызван AddDbContext (), а затем дополнительно будет вызван OnConfiguring ().
Когда вы запускаете команду «Add-Migration», миграции будут генерироваться в DbContext с помощью строка подключения заполнителя, хотя арендатор не указан. Когда вы запускаете свое приложение, вам просто нужно добавить промежуточное программное обеспечение и вызвать Migrate (), чтобы применить эти миграции к вашим базам данных-арендаторам, прежде чем вы go подключитесь к промежуточному программному обеспечению MVC.
public class TenantIdentifier
{
private readonly RequestDelegate _next;
private readonly IConfiguration _configuration;
private readonly IHttpContextAccessor _httpContextAccessor;
public TenantIdentifier(RequestDelegate next, IConfiguration configuration, IHttpContextAccessor httpContextAccessor)
{
_next = next;
_configuration = configuration;
_httpContextAccessor = httpContextAccessor;
}
public async Task Invoke(HttpContext httpContext, HostDbContext hostDbContext)
{
// Get tenant id from token
var tenantId = httpContext.User.FindFirst(Constants.TENANT)?.Value;
// Set tenant id to httpContext.Items
if (!string.IsNullOrWhiteSpace(tenantId))
{
var tenant = hostDbContext.Tenants.SingleOrDefault(t => t.Id.ToString() == tenantId);
httpContext.Items["TENANT"] = tenant;
using(var tenantDbContext = new TenantDbContext(new DbContextOptions<TenantDbContext>(), _httpContextAccessor))
{
tenantDbContext.Database.Migrate();
}
}
await _next.Invoke(httpContext);
}
}
Затем, вам просто нужно запустить «Add-Migration» один раз, вообще не создавая БД-заполнитель.