Не удается перенастроить DbContext более одного раза
У меня есть.Net Core 2.1 Web API, который общается с базой данных MySQL, используя провайдер Pomelo (версия 2.1.0-rc1-final). Поскольку это мультитенантное приложение, API должен изменять базы данных в зависимости от того, какой арендатор подключается. Интерфейсное веб-приложение сообщает API-интерфейсу, какой клиент выполняет запрос, включив заголовок TenantId в запрос HTPP.
Когда API получает HTTP-запрос от внешнего интерфейса, у меня в конвейере API есть служба, которая считывает TenantId из запроса, а затем это используется для определения, к какой базе данных API должен подключаться.
Для подключения к различным базам данных я изменяю строку подключения DbContext. Я делаю это в событии OnConfiguring:
protected override void OnConfiguring(DbContextOptionsBuilder options)
{
string connectionString = CreateConnectionString();
optionsBuilder.UseMySql(connectionString);
base.OnConfiguring(optionsBuilder);
}
Моя проблема заключается в том, что это работает в первый раз, но во второй раз это событие срабатывает, когда он выполняет optionsBuilder.UseMySql(connectionString);
строка, это бросает это исключение:
Элемент с таким же ключом уже был добавлен. Ключ: Pomelo.EntityFrameworkCore.MySql.Infrastructure.Internal.MySqlOptionsExtension
Это позволяет мне настроить DbContext только один раз. Мне нужно перенастраивать его каждый раз, когда вызывается конечная точка действия API. Есть идеи?
0 ответов
Я не уверен на 100%, что я сделал, но сейчас это работает. Процесс выглядит следующим образом: я создал промежуточное ПО для идентификации клиента, выполняющего запрос (т.е. использующего API). Это делается путем чтения "tenantId", который клиентское приложение отправляет в заголовке запроса, а затем сохранения этого tenantId в глобальной переменной (я использовал HttpContext). Поскольку промежуточное ПО выполняется раньше, чем большинство других вещей, к моменту срабатывания события OnConfiguring в dbContext я уже знаю, какой это клиент. Итак, в событии OnConfiguring для dbContext я установил для параметра connectionString dbContext все, что он должен быть (в зависимости от tenantId). Я не могу опубликовать код в этом комментарии, потому что комментарии не допускают разрывов строк и они слишком короткие, но если хотите, пришлите мне свой адрес электронной почты, и я отправлю вам код по электронной почте.