abp
/Data
/
MyProjectNameDbMigrationService.cs
88 строк · 3.2 Кб
1using Microsoft.Extensions.Logging.Abstractions;2using Volo.Abp.Data;3using Volo.Abp.DependencyInjection;4using Volo.Abp.Identity;5using Volo.Abp.MultiTenancy;6using Volo.Abp.TenantManagement;7
8namespace MyCompanyName.MyProjectName.Data;9
10public class MyProjectNameDbMigrationService : ITransientDependency11{
12public ILogger<MyProjectNameDbMigrationService> Logger { get; set; }13
14private readonly IDataSeeder _dataSeeder;15private readonly MyProjectNameMongoDbSchemaMigrator _dbSchemaMigrator;16private readonly ITenantRepository _tenantRepository;17private readonly ICurrentTenant _currentTenant;18
19public MyProjectNameDbMigrationService(20IDataSeeder dataSeeder,21MyProjectNameMongoDbSchemaMigrator dbSchemaMigrator,22ITenantRepository tenantRepository,23ICurrentTenant currentTenant)24{25_dataSeeder = dataSeeder;26_dbSchemaMigrator = dbSchemaMigrator;27_tenantRepository = tenantRepository;28_currentTenant = currentTenant;29
30Logger = NullLogger<MyProjectNameDbMigrationService>.Instance;31}32
33public async Task MigrateAsync()34{35Logger.LogInformation("Started database migrations...");36
37await MigrateDatabaseSchemaAsync();38await SeedDataAsync();39
40Logger.LogInformation($"Successfully completed host database migrations.");41
42var tenants = await _tenantRepository.GetListAsync(includeDetails: true);43
44var migratedDatabaseSchemas = new HashSet<string>();45foreach (var tenant in tenants)46{47using (_currentTenant.Change(tenant.Id))48{49if (tenant.ConnectionStrings.Any())50{51var tenantConnectionStrings = tenant.ConnectionStrings52.Select(x => x.Value)53.ToList();54
55if (!migratedDatabaseSchemas.IsSupersetOf(tenantConnectionStrings))56{57await MigrateDatabaseSchemaAsync(tenant);58
59migratedDatabaseSchemas.AddIfNotContains(tenantConnectionStrings);60}61}62
63await SeedDataAsync(tenant);64}65
66Logger.LogInformation($"Successfully completed {tenant.Name} tenant database migrations.");67}68
69Logger.LogInformation("Successfully completed all database migrations.");70Logger.LogInformation("You can safely end this process...");71}72
73private async Task MigrateDatabaseSchemaAsync(Tenant? tenant = null)74{75Logger.LogInformation($"Migrating schema for {(tenant == null ? "host" : tenant.Name + " tenant")} database...");76await _dbSchemaMigrator.MigrateAsync();77}78
79private async Task SeedDataAsync(Tenant? tenant = null)80{81Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed...");82
83await _dataSeeder.SeedAsync(new DataSeedContext(tenant?.Id)84.WithProperty(IdentityDataSeedContributor.AdminEmailPropertyName, IdentityDataSeedContributor.AdminEmailDefaultValue)85.WithProperty(IdentityDataSeedContributor.AdminPasswordPropertyName, IdentityDataSeedContributor.AdminPasswordDefaultValue)86);87}88}
89