【发布时间】:2021-05-01 03:00:33
【问题描述】:
我有一个 ASP.NET Core 3.1 应用程序,它使用现有的 Postgres 数据库,其中每个租户都存储在单独的架构中。这在 HTTP 请求中效果很好,租户标识符存储在请求中,在我的 DbContext 中,OnConfiguring 方法中有以下代码:
if (this._httpContextAccessor.HttpContext?.Items["tenant"] != null)
{
string tenant = this._httpContextAccessor.HttpContext.Items["tenant"].ToString();
builder.SearchPath = tenant;
}
else
{
throw new InvalidOperationException("The defined tenant does not exist. Cannot create DB Context");
}
这会针对当前请求调整租户的 Postgres 搜索路径。
我现在正在尝试添加一个也需要使用数据库的后台服务。我的后台服务使用 IServiceProvider,我尝试按如下方式创建我的 DbContext,由于我使用的多租户实现,这显然不起作用:
using var scope = this.serviceProvider.CreateScope();
var context = scope.ServiceProvider.GetService<MyDbContext>();
后台服务没有 HTTP 请求那样的租户,它需要自己处理这方面并生成具有不同租户的 DbContext。
我不确定如何以某种方式调整我的上下文,以便我可以创建具有不同租户的实例。或者这是否真的是我应该做的,或者是否有更好的方法来处理这个问题。我知道通过 Postgres 架构的多租户不是 ASP.NET Core 的典型案例,但我现在无法更改。
当我需要从 HTTP 请求和与特定租户无关的后台服务中使用 DbContext 时,我如何以及应该如何以及应该将 DbContext 与基于 Postgres 架构的租户一起使用(但例如,循环通过租户以在每个租户上执行工作)租户)?
【问题讨论】:
-
不要使用
HttpContext来获取租户ID,而是做一个你可以控制的服务。该服务可以使用HttpContext,但如果您告诉它,它将使用其他东西。 -
我认为你应该用单一模式和复合键管理多租户系统,每个表都有租户 ID
标签: c# postgresql entity-framework-core dbcontext