gpt4 book ai didi

asp.net-core - 具有独立数据库的 ASP.NET Core

转载 作者:行者123 更新时间:2023-12-04 12:51:42 24 4
gpt4 key购买 nike

我想为中央服务器上的多个客户创建一个带有 EF Core 的 ASP.NET Core Web 应用程序。每个客户都应该有自己的数据库,该数据库通过从属于客户的测量设备读取数据来填充。

我找到了建议创建多个数据库上下文的解决方案。问题在于它不可扩展。我事先不知道客户/数据库的数量。可能是10,也可能是100。

另一种解决方案可能是在 IIS 中创建单独的应用程序(为了简单起见,我们只讨论 Windows 和 IIS)。每个应用程序都有自己的路径和指定数据库连接字符串的 appsettings.json。这样做的问题是复制(自包含)应用程序需要大量磁盘空间和大量维护工作。

问题:

1) 有没有办法动态创建数据库上下文列表,在我的 appsettings.json 中给定多个连接字符串?

2) 有没有办法在 IIS 中只保留一个物理安装,但有多个站点,每个站点都使用不同的 appsettings.json 启动应用程序,或者可能是一个启动参数,告诉应用程序使用 appsettings.json 中的哪个连接字符串?

3)有没有完全不同的更好的方法来实现它?

最佳答案

我看到这是一个老问题,但这是我现在正在处理的场景。

如果您的租户具有相同的架构和不同的数据库,正确的方法是使用一个主上下文来检索连接字符串,使用另一个上下文来连接到不同的租户。

在您根据主机访问一个或另一个租户的非常常见的场景中,这可能是解决方案:

  • 从主上下文中获取连接字符串
  • 更改 TenantContext 的连接字符串
  • 检索该租户的数据
    public class ContextTenant : IdentityDbContext<ApplicationUser, 
    ApplicationRole, int>, IContextTenant
    {
    private readonly string _tenantDatabase;

    public ContextTenant(DbContextOptions<ContextTenant> options, ITenantProvider tenantProvider) : base(options)
    {
    _tenantDatabase = tenantProvider.GetTenantDatabase();
    SeedData.Initialize(this);
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
    optionsBuilder.UseMySQL(_teanantDatabase);
    base.OnConfiguring(optionsBuilder);
    }

    ...
    create DbSets
    other operations
    ...
    }

  • 然后检索连接字符串:
    public class WebTenantProvider : ITenantProvider
    {
    private readonly string _tenantDatabase;

    public WebClientProvider(IHttpContextAccessor httpAccessor, ContextMaster dataContext)
    {
    var host = httpAccessor.HttpContext.Request.Host.Host;
    _tenantDatabase = dataContext.GetTenantDatabaseFromHost(host);
    }

    public string GetTenantDatabase()
    {
    return _tenantDatabase;
    }
    }

    public interface ITenantProvider
    {
    string GetTenantDatabase();
    }

    你的第二个问题也很有趣,因为我这里还有一个问题。我的应用程序本地化资源是可编辑的,我从数据库中获取它们而不是 Regx 文件,因此每个租户都有自己的资源,他们可以编辑它们。

    是否可能只有一个应用程序包含所有文件,但为不同的主机启动该应用程序的不同实例?如果这是可能的,我们不需要连接字符串的东西,因为每个实例都将具有所有独立的...

    关于asp.net-core - 具有独立数据库的 ASP.NET Core,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45724257/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com