Вы на правильном пути, но это не будет универсальный DbContext
, а только тот, у которого строка соединения установлена во время выполнения.Поэтому вместо GetConnectionString вы хотите создать DbContext
фабрику, которая требует, чтобы идентификатор арендатора возвращал ваш новый DbContext ("connectionString").
Давайте назовем его TenantDbContext
:
public class TenantDbContext : DbContext
{
public TenantDbContext(string connectionString) : base(connectionString)
{
}
// Or
public TenantDbContext(int tenantId) : base(GetConnectionString(tenantId))
{
}
}
при использовании фабрики:
public class TenantDbContextFactory : IDbContextFactory<TenantDbContext, int>
{
public TenantDbContext Create(int tenantId)
{
var connectionString = GetConnectionString(tenantId);
return new TenantDbContext(connectionString);
}
// ... rest of factory
}
public interface IDbContextFactory<TContext, TKey> where TContext :DbContext
{
TContext Create(TKey key);
}
Если вы используете контейнер внедрения зависимостей, вы также можете подключить его для возврата TenantDbContext
на основе идентификатора арендатора.