Мультитенант с несколькими базами данных (вторая операция началась в этом контексте до завершения предыдущей асинхронной операции) - PullRequest
2 голосов
/ 23 мая 2019

Я пытаюсь войти в свое приложение с определенным арендатором, который имеет свою собственную базу данных. И я всегда получал эту ошибку: "Вторая операция началась в этом контексте до завершения предыдущей асинхронной операции. Используйте 'await', чтобы убедиться, что любые асинхронные операции завершены перед вызовом другого метода в этом контексте. Любые члены экземпляра не являются гарантированно безопасна для ниток. ". Как я могу это исправить?

Я использую AspNet Boilerplate MVC5.x с базой данных Oracle Oracle. Я включил многопользовательский режим и попытался войти с арендатором, у которого есть собственная база данных. Я сделал некоторые изменения в платформе, и на моей текущей странице создания арендатора нет поля для заполнения строки подключения. Поэтому я создал это поле, запустив проект в режиме отладки и сгенерировав зашифрованную строку для моей строки подключения. Я проверял строку подключения раньше, и она работает отлично. Затем я присваиваю результат Tenant1 столбцу connectionString. Когда я пытаюсь войти в систему с этим арендатором, я получаю сообщение об ошибке.

Ниже приведен мой код DbContext:

public MyProjectDbContext(string nameOrConnectionString): base(GetDbConnection(nameOrConnectionString), true)
{

}

public static DbConnection GetDbConnection(string companyName)
{
      System.Data.SqlClient.SqlConnectionStringBuilder builder = null;
      if (companyName.ToUpper().Contains("USER ID") && companyName.ToUpper().Contains("PASSWORD"))
      {
          builder = new System.Data.SqlClient.SqlConnectionStringBuilder(companyName);
      }
      else
      {
          builder = new System.Data.SqlClient.SqlConnectionStringBuilder(System.Configuration.ConfigurationManager.ConnectionStrings[companyName].ConnectionString);
      }

      DbConnection serviceDiscoveryDbConnection = DbProviderFactories.GetFactory("Oracle.ManagedDataAccess.Client").CreateConnection();
      serviceDiscoveryDbConnection.ConnectionString = GetOracleManagedConnectionString(builder.DataSource, builder.UserID, builder.Password);

      return serviceDiscoveryDbConnection;
}

Я уже пробовал AspNetBoilerplate sample и изменил его на использование mysql. Однако, когда я пытаюсь создать арендатора с заполненной строкой соединения, я получаю следующую ошибку: «Несколько одновременных соединений или соединений с разными строками соединения внутри одной транзакции в настоящее время не поддерживаются». . На мой взгляд, это похожая ошибка. Итак, я думаю, что решение должно быть почти одинаковым для обеих проблем. Даже когда я вручную добавляю connectionString в базу данных mysql, я получаю ту же ошибку при попытке войти в систему.

Я хочу иметь мульти-дБ / мультитенант, где у каждого арендатора есть своя собственная база данных. Поэтому, если я вхожу в систему с помощью Tenant2 / myuser , когда я захожу на домашнюю страницу, я хочу выполнять все вызовы в базу данных корреспондентов Tenant2 .

Заранее спасибо =)

...