ASP.NET Core具有单独的数据库

时间:2017-08-16 23:06:59

标签: asp.net-core entity-framework-core

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

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

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

问题:

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

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

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

1 个答案:

答案 0 :(得分:1)

我认为这是一个老问题,但这是我现在正在处理的情景。

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

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

  1. 从主要上下文获取连接字符串
  2. 更改TenantContext的连接字符串
  3. 检索该租户的数据

    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
    ...
    }
    
  4. 然后检索连接字符串:

    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文件,因此每个租户都有自己的资源,他们可以编辑它们。

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

相关问题