【问题标题】:Cannot reconfigure DbContext more than once不能多次重新配置 DbContext
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-03
    • 2016-03-14
    • 2015-05-17
    • 1970-01-01
    • 2018-08-25
    • 2020-06-05
    • 2016-08-29
    • 2013-10-14
    相关资源
    最近更新 更多