代码之家  ›  专栏  ›  技术社区  ›  Fabricio Rodriguez

不能多次重新配置DbContext

  •  0
  • Fabricio Rodriguez  · 技术社区  · 7 年前

    我有一个.NETCore2.1WebAPI,使用PomeloProvider(版本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.mysqloptions扩展

    它只允许我配置DbContext一次。每次调用API操作端点时,我都需要重新配置它。有什么想法吗?

    0 回复  |  直到 4 年前
        1
  •  0
  •   Fabricio Rodriguez    5 年前

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