'EF Core - multi tenant application with 2 DB Context

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?



Solution 1:[1]

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.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 OEDev