微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我想在中央服务器上为多个客户创建一个带有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文件,因此每个租户都有自己的资源,他们可以编辑它们.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐