From 3db12e6a4dbae32cb935a4e31b779ac58701c857 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 20 Apr 2020 20:30:05 +0800 Subject: [PATCH 1/3] Skip repeated database migration and unify MigrateHostDatabaseAsync and MigrateTenantDatabasesAsync methods --- .../Data/MyProjectNameDbMigrationService.cs | 42 ++++++++----------- 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/Data/MyProjectNameDbMigrationService.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/Data/MyProjectNameDbMigrationService.cs index 6c09ffd233..d1edf807a7 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/Data/MyProjectNameDbMigrationService.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/Data/MyProjectNameDbMigrationService.cs @@ -37,51 +37,45 @@ namespace MyCompanyName.MyProjectName.Data { Logger.LogInformation("Started database migrations..."); - await MigrateHostDatabaseAsync(); + await MigrateDatabaseAsync(); var tenants = await _tenantRepository.GetListAsync(includeDetails: true); - var i = 0; + var migratedDatabases = new HashSet(); foreach (var tenant in tenants.Where(t => t.ConnectionStrings.Any())) { - using (_currentTenant.Change(tenant.Id)) + var tenantConnectionStrings = tenant.ConnectionStrings.Select(x => x.Value).ToList(); + + if (!migratedDatabases.Any() || !migratedDatabases.IsSupersetOf(tenantConnectionStrings)) { - Logger.LogInformation($"Migrating {tenant.Name} database schema... ({++i} of {tenants.Count})"); - await MigrateTenantDatabasesAsync(tenant); - Logger.LogInformation($"Successfully completed {tenant.Name} database migrations."); + using (_currentTenant.Change(tenant.Id)) + { + await MigrateDatabaseAsync(tenant); + } + + tenantConnectionStrings.ForEach(x => migratedDatabases.Add(x)); } } Logger.LogInformation("Successfully completed database migrations."); } - private async Task MigrateHostDatabaseAsync() + private async Task MigrateDatabaseAsync(Tenant tenant = null) { - Logger.LogInformation("Migrating host database schema..."); + var migrateName = tenant == null ? "host" : tenant.Name + " tenant"; + + Logger.LogInformation($"Migrating schema for {migrateName} database..."); foreach (var migrator in _dbSchemaMigrators) { await migrator.MigrateAsync(); } - Logger.LogInformation("Executing host database seed..."); - await _dataSeeder.SeedAsync(); - - Logger.LogInformation("Successfully completed host database migrations."); - } - - private async Task MigrateTenantDatabasesAsync(Tenant tenant) - { - Logger.LogInformation($"Migrating schema for {tenant.Name} database..."); + Logger.LogInformation($"Executing {migrateName} database seed..."); - foreach (var migrator in _dbSchemaMigrators) - { - await migrator.MigrateAsync(); - } + await _dataSeeder.SeedAsync(tenant?.Id); - Logger.LogInformation($"Executing {tenant.Name} tenant database seed..."); - - await _dataSeeder.SeedAsync(tenant.Id); + Logger.LogInformation($"Successfully completed {migrateName} database migrations."); } } } \ No newline at end of file From 2c05afc6f5a986382977048ea048190a6446e077 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 21 Apr 2020 17:01:36 +0800 Subject: [PATCH 2/3] Initialize the seed data for tenants with the same connection string --- .../Data/MyProjectNameDbMigrationService.cs | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/Data/MyProjectNameDbMigrationService.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/Data/MyProjectNameDbMigrationService.cs index d1edf807a7..5fc3b8d179 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/Data/MyProjectNameDbMigrationService.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/Data/MyProjectNameDbMigrationService.cs @@ -37,8 +37,11 @@ namespace MyCompanyName.MyProjectName.Data { Logger.LogInformation("Started database migrations..."); - await MigrateDatabaseAsync(); - + await MigrateDatabaseSchemaAsync(); + await SeedDataAsync(); + + Logger.LogInformation($"Successfully completed host database migrations."); + var tenants = await _tenantRepository.GetListAsync(includeDetails: true); var migratedDatabases = new HashSet(); @@ -50,32 +53,35 @@ namespace MyCompanyName.MyProjectName.Data { using (_currentTenant.Change(tenant.Id)) { - await MigrateDatabaseAsync(tenant); + await MigrateDatabaseSchemaAsync(tenant); } - tenantConnectionStrings.ForEach(x => migratedDatabases.Add(x)); + migratedDatabases.AddIfNotContains(tenantConnectionStrings); } + + await SeedDataAsync(tenant); + + Logger.LogInformation($"Successfully completed {tenant.Name} tenant database migrations."); } Logger.LogInformation("Successfully completed database migrations."); } - private async Task MigrateDatabaseAsync(Tenant tenant = null) + private async Task MigrateDatabaseSchemaAsync(Tenant tenant = null) { - var migrateName = tenant == null ? "host" : tenant.Name + " tenant"; - - Logger.LogInformation($"Migrating schema for {migrateName} database..."); + Logger.LogInformation($"Migrating schema for {(tenant == null ? "host" : tenant.Name + " tenant")} database..."); foreach (var migrator in _dbSchemaMigrators) { await migrator.MigrateAsync(); } - - Logger.LogInformation($"Executing {migrateName} database seed..."); - + } + + private async Task SeedDataAsync(Tenant tenant = null) + { + Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed..."); + await _dataSeeder.SeedAsync(tenant?.Id); - - Logger.LogInformation($"Successfully completed {migrateName} database migrations."); } } } \ No newline at end of file From 90a7d92843b9abb03e88d3db8f7219d7a9a6b0c4 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 21 Apr 2020 17:54:07 +0800 Subject: [PATCH 3/3] Improve code --- .../Data/MyProjectNameDbMigrationService.cs | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/Data/MyProjectNameDbMigrationService.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/Data/MyProjectNameDbMigrationService.cs index 5fc3b8d179..dcc59b4288 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/Data/MyProjectNameDbMigrationService.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/Data/MyProjectNameDbMigrationService.cs @@ -39,28 +39,27 @@ namespace MyCompanyName.MyProjectName.Data await MigrateDatabaseSchemaAsync(); await SeedDataAsync(); - + Logger.LogInformation($"Successfully completed host database migrations."); - + var tenants = await _tenantRepository.GetListAsync(includeDetails: true); - var migratedDatabases = new HashSet(); + var migratedDatabaseSchemas = new HashSet(); foreach (var tenant in tenants.Where(t => t.ConnectionStrings.Any())) { var tenantConnectionStrings = tenant.ConnectionStrings.Select(x => x.Value).ToList(); - - if (!migratedDatabases.Any() || !migratedDatabases.IsSupersetOf(tenantConnectionStrings)) + using (_currentTenant.Change(tenant.Id)) { - using (_currentTenant.Change(tenant.Id)) + if (!migratedDatabaseSchemas.Any() || !migratedDatabaseSchemas.IsSupersetOf(tenantConnectionStrings)) { await MigrateDatabaseSchemaAsync(tenant); + + migratedDatabaseSchemas.AddIfNotContains(tenantConnectionStrings); } - migratedDatabases.AddIfNotContains(tenantConnectionStrings); + await SeedDataAsync(tenant); } - await SeedDataAsync(tenant); - Logger.LogInformation($"Successfully completed {tenant.Name} tenant database migrations."); } @@ -69,18 +68,19 @@ namespace MyCompanyName.MyProjectName.Data private async Task MigrateDatabaseSchemaAsync(Tenant tenant = null) { - Logger.LogInformation($"Migrating schema for {(tenant == null ? "host" : tenant.Name + " tenant")} database..."); + Logger.LogInformation( + $"Migrating schema for {(tenant == null ? "host" : tenant.Name + " tenant")} database..."); foreach (var migrator in _dbSchemaMigrators) { await migrator.MigrateAsync(); } } - + private async Task SeedDataAsync(Tenant tenant = null) { Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed..."); - + await _dataSeeder.SeedAsync(tenant?.Id); } }