EF核心 - 具有2 dB上下文的多租户应用程序

发布于 2025-01-27 15:34:55 字数 1431 浏览 4 评论 0原文

背景:

.NET 6应用程序(前端Angular Spa)将作为单个应用程序部署,每个租户1个数据库。有一个共享数据库(称为GlobalContext),该数据库包含房客和房客信息。

在我的program.cs中,我没有与租户数据库的连接字符串,因为该信息仅在用户登录后才可用。

builder.Services.AddDbContext<GlobalContext>(
options => options.UseSqlServer(config.GetValue<string>("ConnectionStringGlobal"))

);

在FancipeApcontext中的OnConfifing方法中没有连接字符串

builder.Services.AddDbContext<FinanceAppContext>();

,我使用服务获得连接字符串;

            var tenant = await _tenantService.GetConnectionString();
        optionsBuilder.UseSqlServer(_config.GetValue<string>(tenant));

        base.OnConfiguring(optionsBuilder);

TentService是一项临时服务,可从GlobalContext获得登录的用户租户,

    public async Task<string> GetConnectionString() {
    try
    {
        var userId = _contextAccessor.HttpContext.User.FindFirst(ClaimTypes.Email).Value;

        var user = await _globalContext.TenantUser
            .Include(tenantuser => tenantuser.Tenant)
            .FirstOrDefaultAsync(tenantuser => tenantuser.EmailAddress == userId);

        return user.Tenant.Name;            
    }
    catch (System.Exception)
    {            
        return "";
    }
}

但是当我尝试通过FinanceApcontext访问任何数据时,我会收到以下错误;

已经配置了一个关系商店,而没有指定使用

的 DBConnection或Connection字符串在配置中指定一个似乎是一个问题吗?

Background:

.NET 6 application (front-end Angular SPA) Will be deployed as single application with 1 database per tenant. There is a shared database (called GlobalContext) which holds Tenant and TenantUser information.

In my Program.cs I don't have a connection string to the tenant database, as that information information is only available after a user has logged in.

builder.Services.AddDbContext<GlobalContext>(
options => options.UseSqlServer(config.GetValue<string>("ConnectionStringGlobal"))

);

No connection string specified here

builder.Services.AddDbContext<FinanceAppContext>();

In the OnConfiguring method in the FinanceappContext I obtain the connection string using a service;

            var tenant = await _tenantService.GetConnectionString();
        optionsBuilder.UseSqlServer(_config.GetValue<string>(tenant));

        base.OnConfiguring(optionsBuilder);

The TenantService is a transient service which obtains the logged in users tenant from the GlobalContext

    public async Task<string> GetConnectionString() {
    try
    {
        var userId = _contextAccessor.HttpContext.User.FindFirst(ClaimTypes.Email).Value;

        var user = await _globalContext.TenantUser
            .Include(tenantuser => tenantuser.Tenant)
            .FirstOrDefaultAsync(tenantuser => tenantuser.EmailAddress == userId);

        return user.Tenant.Name;            
    }
    catch (System.Exception)
    {            
        return "";
    }
}

But when I try to access any data via the FinanceAppContext I get the following error;

A relational store has been configured without specifying either the DbConnection or connection string to use

It seems like the fact I don't specify a connection string in Program.cs and but do specify one in OnConfiguring seems to be an issue?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

伊面 2025-02-03 15:34:55

因此,问题在于我的配置方法被标记为异步,我正在等待我的TentantService获得连接字符串。我删除了异步/等待的等待,现在可以从GlobalContext中检索用户。

So the issue was that my OnConfiguring method was marked as async and I was making an await call to my TenantService to obtain the connection string. I remove the async/await and the retrieval of the user from the GlobalContext now works.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文