首页 > 解决方案 > 具有多个数据库的多租户(在前一个异步操作完成之前在此上下文上启动了第二个操作)

问题描述

我正在尝试使用拥有自己数据库的特定租户登录我的应用程序。而且我总是得到这个错误:“在前一个异步操作完成之前,在这个上下文上开始了第二个操作。使用'await'来确保在这个上下文上调用另一个方法之前已经完成了任何异步操作。不保证任何实例成员都是线程安全。” . 我该如何解决?

我将 AspNet Boilerplate MVC5.x 与 oracle sql 数据库一起使用。我启用了多租户,并尝试使用拥有自己数据库的租户登录。我对框架进行了一些修改,我当前的租户创建页面没有要填写的 connectionString 字段。因此,我创建了以调试模式运行项目并为我的 connectionString 生成加密字符串的字段。我之前测试了connectionString,它工作得很好。接下来,我将结果分配给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示例,并将其更改为使用 mysql。但是,当我尝试创建一个已填充连接字符串的租户时,出现以下错误:“当前不支持多个同时连接或同一事务中具有不同连接字符串的连接。” . 在我看来,这是一个类似的错误。所以,我认为这两个问题的解决方案应该几乎相同。即使当我手动将 connectionString 添加到 mysql 数据库时,我在尝试登录时也遇到了同样的错误。

我想要的是拥有一个多数据库/多租户,其中每个租户都有自己的数据库。因此,如果我使用Tenant2/myuser登录,当我进入主页时,我想对Tenant2对应的数据库进行所有调用。

提前感谢=)

标签: aspnetboilerplate

解决方案


推荐阅读