【发布时间】:2018-06-06 14:26:12
【问题描述】:
我有一个使用 Pomelo 提供程序(版本 2.1.0-rc1-final)与 MySQL 数据库通信的 .Net Core 2.1 Web API。因为这是一个多租户应用程序,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 操作端点时,我都需要重新配置它。有什么想法吗?
【问题讨论】:
-
您找到解决方案了吗?这对我来说完全一样......
-
老实说,我不是 100% 确定我做了什么 - 但它现在正在工作,哈哈。但过程如下:我创建了中间件来识别发出请求的租户(即使用 API)。这是通过读取客户端应用程序在请求标头中发送的“tenantId”,然后将该tenantId 保存到全局变量中来完成的(我使用了 HttpContext)。因为中间件在几乎大多数其他事情之前执行,所以当 dbContext 的 OnConfiguring 事件触发时,我已经知道这是哪个租户......(在下面继续)
-
...然后,在 dbContext 的 OnConfiguring 事件中,我将 dbContext 的 connectionString 设置为应有的值(取决于tenantId)。我无法在此评论中发布代码,因为 cmets 不允许换行并且它们太短,但是如果您愿意,请将您的电子邮件地址发送给我,我会将代码通过电子邮件发送给您。
-
如果这解决了您的问题,您应该将其发布为答案。
-
感谢 HazardousGlitch。我完全忘了结束这个问题。现在会这样做
标签: asp.net-core-webapi multi-tenant pomelo-entityframeworkcore-mysql