【问题标题】:Trying to create the database using ABP framework while DB Migration尝试在数据库迁移时使用 ABP 框架创建数据库
【发布时间】:2021-05-20 07:53:47
【问题描述】:

我在“[AbpTenantConnectionStrings]”表中插入了相同租户 ID 的连接字符串。

我的目标是创建数据库并迁移数据库

DB

在仅在“正在创建默认数据库”的代码下运行时,任何人都可以让我知道如何创建和迁移其他数据库。下面的代码需要做哪些改动。

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

            var migratedDatabaseSchemas = new HashSet<string>();
            foreach (var tenant in tenants)
            {
                using (_currentTenant.Change(tenant.Id))
                {
                    if (tenant.ConnectionStrings.Any())
                    {
                       

                        var tenantConnectionStrings = tenant.ConnectionStrings
                            .Select(x => x.Value)
                            .ToList();

                        if (!migratedDatabaseSchemas.IsSupersetOf(tenantConnectionStrings))
                        {
                            await MigrateDatabaseSchemaAsync(tenant);

                            migratedDatabaseSchemas.AddIfNotContains(tenantConnectionStrings);
                        }
                    }

                    await SeedDataAsync(tenant);
                }

【问题讨论】:

    标签: multi-tenant asp.net-core-3.1 abp


    【解决方案1】:

    在进行以下更改后,可以根据“AbpTenantConnectionStrings”中插入的连接字符串迁移或创建 Db:

     public async Task MigrateAsync()
        {
            var initialMigrationAdded = AddInitialMigrationIfNotExist();
    
    
            //var str = (await _connectionResolver.ResolveAsync("Default1"));
    
            if (initialMigrationAdded)
            {
                return;
            }
    
            Logger.LogInformation("Started database migrations...");
    
            await MigrateDatabaseSchemaAsync();
            await SeedDataAsync();
    
            Logger.LogInformation($"Successfully completed host database migrations.");
    
            var tenants = await _tenantRepository.GetListAsync(includeDetails: true);
    
            var migratedDatabaseSchemas = new HashSet<string>();
            foreach (var tenant in tenants)
            {
                using (_currentTenant.Change(tenant.Id))
                {
                    if (tenant.ConnectionStrings.Any())
                    {
                       
    
                        var tenantConnectionStrings = tenant.ConnectionStrings
                            .Select(x => x.Value)
                            .ToList();
    
                        tenantConnectionStrings.ForEach(async s =>
                        {                            
                                await MigrateDatabaseSchemaAsync(s);
                               // migratedDatabaseSchemas.AddIfNotContains(s);                          
    
                        });
    
                        //if (!migratedDatabaseSchemas.IsSupersetOf(tenantConnectionStrings))
                        //{
                        //    await MigrateDatabaseSchemaAsync(tenant);
    
                        //    migratedDatabaseSchemas.AddIfNotContains(tenantConnectionStrings);
                        //}
                    }
    
                    await SeedDataAsync(tenant);
                }
    
                Logger.LogInformation($"Successfully completed {tenant.Name} tenant database migrations.");
            }
    
            Logger.LogInformation("Successfully completed all database migrations.");
            Logger.LogInformation("You can safely end this process...");
        }
    
    
    
     private async Task MigrateDatabaseSchemaAsync(string str)
        {
            //Logger.LogInformation(
            //    $"Migrating schema for {(tenant == null ? "host" : tenant.Name + " tenant")} database...");
    
            foreach (var migrator in _dbSchemaMigrators)
            {
                await migrator.MigrateAsync(str);
            }
        }
    
    
     public interface IBookStoreDbSchemaMigrator
    {
        Task MigrateAsync();
        Task MigrateAsync(string con);
    }
    
     public class EntityFrameworkCoreBookStoreDbSchemaMigrator
        : IBookStoreDbSchemaMigrator, ITransientDependency
    {
        private readonly IServiceProvider _serviceProvider;
    
        public EntityFrameworkCoreBookStoreDbSchemaMigrator(
            IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }
    
        public async Task MigrateAsync()
        {
            /* We intentionally resolving the BookStoreMigrationsDbContext
             * from IServiceProvider (instead of directly injecting it)
             * to properly get the connection string of the current tenant in the
             * current scope.
             */
    
            await _serviceProvider.GetRequiredService<BookStoreMigrationsDbContext>()
                .Database
                .MigrateAsync();
    
        }
    
        public async Task MigrateAsync(string con)
        {
    
            var context = _serviceProvider
                  .GetRequiredService<BookStoreMigrationsDbContext>();
            context.Database.SetConnectionString(con);
            context.Database.Migrate();
    
        }
    }
    

    如果有人有建议或更好的方法,请告诉我。

    【讨论】:

      猜你喜欢
      • 2017-02-04
      • 1970-01-01
      • 2016-05-10
      • 1970-01-01
      • 2014-07-08
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 2015-10-14
      相关资源
      最近更新 更多