abp

Форк
0
88 строк · 3.2 Кб
1
using Microsoft.Extensions.Logging.Abstractions;
2
using Volo.Abp.Data;
3
using Volo.Abp.DependencyInjection;
4
using Volo.Abp.Identity;
5
using Volo.Abp.MultiTenancy;
6
using Volo.Abp.TenantManagement;
7

8
namespace MyCompanyName.MyProjectName.Data;
9

10
public class MyProjectNameDbMigrationService : ITransientDependency
11
{
12
    public ILogger<MyProjectNameDbMigrationService> Logger { get; set; }
13

14
    private readonly IDataSeeder _dataSeeder;
15
    private readonly MyProjectNameMongoDbSchemaMigrator _dbSchemaMigrator;
16
    private readonly ITenantRepository _tenantRepository;
17
    private readonly ICurrentTenant _currentTenant;
18

19
    public MyProjectNameDbMigrationService(
20
        IDataSeeder dataSeeder,
21
        MyProjectNameMongoDbSchemaMigrator dbSchemaMigrator,
22
        ITenantRepository tenantRepository,
23
        ICurrentTenant currentTenant)
24
    {
25
        _dataSeeder = dataSeeder;
26
        _dbSchemaMigrator = dbSchemaMigrator;
27
        _tenantRepository = tenantRepository;
28
        _currentTenant = currentTenant;
29

30
        Logger = NullLogger<MyProjectNameDbMigrationService>.Instance;
31
    }
32

33
    public async Task MigrateAsync()
34
    {
35
        Logger.LogInformation("Started database migrations...");
36

37
        await MigrateDatabaseSchemaAsync();
38
        await SeedDataAsync();
39

40
        Logger.LogInformation($"Successfully completed host database migrations.");
41

42
        var tenants = await _tenantRepository.GetListAsync(includeDetails: true);
43

44
        var migratedDatabaseSchemas = new HashSet<string>();
45
        foreach (var tenant in tenants)
46
        {
47
            using (_currentTenant.Change(tenant.Id))
48
            {
49
                if (tenant.ConnectionStrings.Any())
50
                {
51
                    var tenantConnectionStrings = tenant.ConnectionStrings
52
                        .Select(x => x.Value)
53
                        .ToList();
54

55
                    if (!migratedDatabaseSchemas.IsSupersetOf(tenantConnectionStrings))
56
                    {
57
                        await MigrateDatabaseSchemaAsync(tenant);
58

59
                        migratedDatabaseSchemas.AddIfNotContains(tenantConnectionStrings);
60
                    }
61
                }
62

63
                await SeedDataAsync(tenant);
64
            }
65

66
            Logger.LogInformation($"Successfully completed {tenant.Name} tenant database migrations.");
67
        }
68

69
        Logger.LogInformation("Successfully completed all database migrations.");
70
        Logger.LogInformation("You can safely end this process...");
71
    }
72

73
    private async Task MigrateDatabaseSchemaAsync(Tenant? tenant = null)
74
    {
75
        Logger.LogInformation($"Migrating schema for {(tenant == null ? "host" : tenant.Name + " tenant")} database...");
76
        await _dbSchemaMigrator.MigrateAsync();
77
    }
78

79
    private async Task SeedDataAsync(Tenant? tenant = null)
80
    {
81
        Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed...");
82

83
        await _dataSeeder.SeedAsync(new DataSeedContext(tenant?.Id)
84
            .WithProperty(IdentityDataSeedContributor.AdminEmailPropertyName, IdentityDataSeedContributor.AdminEmailDefaultValue)
85
            .WithProperty(IdentityDataSeedContributor.AdminPasswordPropertyName, IdentityDataSeedContributor.AdminPasswordDefaultValue)
86
        );
87
    }
88
}
89

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.