无法多次重新配置DbContext

时间:2018-06-06 14:26:12

标签: multi-tenant asp.net-core-webapi pomelo

我有一个.Net Core 2.1 Web API,使用Pomelo提供程序(版本2.1.0-rc1-final)与MySQL数据库通信。由于这是一个多租户应用程序,因此API需要根据所连接的租户来更改数据库。前端Web应用程序通过在HTPP请求中包含TenantId标头来告知API哪个租户正在执行请求。

当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动作端点时,我都需要重新配置它。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我不确定100%所做的事情-但现在可以使用了。过程如下:我创建了中间件来识别提出请求的租户(即使用API​​)。这是通过读取客户端应用程序在请求的标头中发送的“ tenantId”,然后将该tenantId保存到全局变量(我使用HttpContext)来完成的。因为中间件在执行几乎所有其他事情之前执行,所以在dbContext的OnConfiguring事件触发时,我已经知道这是哪个租户。于是,在dbContext的OnConfiguring事件上,我将dbContext的connectionString设置为应有的值是(取决于tenantId)。我无法在此注释中发布代码,因为注释不允许换行,而且注释太短,但是如果您愿意,请给我发送您的电子邮件地址,然后我会通过电子邮件向您发送代码。