Example #1
0
 private string GetDbConnString()
 {
     return(_connectionStringResolver.GetNameOrConnectionString(new DbPerTenantConnectionStringResolveArgs(AbpSession.TenantId)));
 }
Example #2
0
        public void Run(bool skipConnVerification)
        {
            var hostConnStr = _connectionStringResolver.GetNameOrConnectionString(new ConnectionStringResolveArgs(MultiTenancySides.Host));

            if (hostConnStr.IsNullOrWhiteSpace())
            {
                Log.Write("Configuration file should contain a connection string named 'Default'");
                return;
            }

            Log.Write("Host database: " + ConnectionStringHelper.GetConnectionString(hostConnStr));
            if (!skipConnVerification)
            {
                Log.Write("Continue to migration for this host database and all tenants..? (Y/N): ");
                var command = Console.ReadLine();
                if (!command.IsIn("Y", "y"))
                {
                    Log.Write("Migration canceled.");
                    return;
                }
            }

            Log.Write("HOST database migration started...");

            try
            {
                _migrator.CreateOrMigrateForHost(SeedHelper.SeedHostDb);
            }
            catch (Exception ex)
            {
                Log.Write("An error occured during migration of host database:");
                Log.Write(ex.ToString());
                Log.Write("Canceled migrations.");
                return;
            }

            Log.Write("HOST database migration completed.");
            Log.Write("--------------------------------------------------------");

            var migratedDatabases = new HashSet <string>();
            var tenants           = _tenantRepository.GetAllList(t => t.ConnectionString != null && t.ConnectionString != "");

            for (int i = 0; i < tenants.Count; i++)
            {
                var tenant = tenants[i];
                Log.Write(string.Format("Tenant database migration started... ({0} / {1})", (i + 1), tenants.Count));
                Log.Write("Name              : " + tenant.Name);
                Log.Write("TenancyName       : " + tenant.TenancyName);
                Log.Write("Tenant Id         : " + tenant.Id);
                Log.Write("Connection string : " + SimpleStringCipher.Instance.Decrypt(tenant.ConnectionString));

                if (!migratedDatabases.Contains(tenant.ConnectionString))
                {
                    try
                    {
                        _migrator.CreateOrMigrateForTenant(tenant);
                    }
                    catch (Exception ex)
                    {
                        Log.Write("An error occured during migration of tenant database:");
                        Log.Write(ex.ToString());
                        Log.Write("Skipped this tenant and will continue for others...");
                    }

                    migratedDatabases.Add(tenant.ConnectionString);
                }
                else
                {
                    Log.Write("This database has already migrated before (you have more than one tenant in same database). Skipping it....");
                }

                Log.Write(string.Format("Tenant database migration completed. ({0} / {1})", (i + 1), tenants.Count));
                Log.Write("--------------------------------------------------------");
            }

            Log.Write("All databases have been migrated.");
        }
Example #3
0
        public bool Run(bool skipConnVerification)
        {
            var hostConnStr = CensorConnectionString(_connectionStringResolver.GetNameOrConnectionString(new ConnectionStringResolveArgs(MultiTenancySides.Host)));

            Console.WriteLine(hostConnStr);

            if (hostConnStr.IsNullOrWhiteSpace())
            {
                _log.Write("配置文件包含一个默认名称为“Default”的连接字符串");
                return(false);
            }

            _log.Write("主机数据库的连接字符串: " + ConnectionStringHelper.GetConnectionString(hostConnStr));
            if (!skipConnVerification)
            {
                _log.Write("是否继续迁移此主机数据库及所有租户数据。同意输入Y键,取消输入N键): ");
                var command = Console.ReadLine();
                if (!command.IsIn("Y", "y"))
                {
                    _log.Write("迁移数据取消。");
                    return(false);
                }
            }

            _log.Write("开始为主机数据库迁移数据...");

            try
            {
                _migrator.CreateOrMigrateForHost(SeedHelper.SeedHostDb);
            }
            catch (Exception ex)
            {
                _log.Write("迁移主机数据库时发生一个内部错误:");
                _log.Write(ex.ToString());
                _log.Write("取消迁移数据。");


                throw new Exception("迁移执行失败");
            }

            _log.Write("主机数据库迁移完成。");
            _log.Write("--------------------------------------------------------");

            var migratedDatabases = new HashSet <string>();
            var tenants           = _tenantRepository.GetAllList(t => t.ConnectionString != null && t.ConnectionString != "");

            for (var i = 0; i < tenants.Count; i++)
            {
                var tenant = tenants[i];
                _log.Write($"开始为租户数据库迁移数据,迁移状态:当前租户{i + 1} /总租户数量{tenants.Count}... ");
                _log.Write("租户简称              : " + tenant.Name);
                _log.Write("租户名称       : " + tenant.TenancyName);
                _log.Write("租户 Id         : " + tenant.Id);
                _log.Write("连接字符串信息 : " + SimpleStringCipher.Instance.Decrypt(tenant.ConnectionString));

                if (!migratedDatabases.Contains(tenant.ConnectionString))
                {
                    try
                    {
                        _migrator.CreateOrMigrateForTenant(tenant);
                    }
                    catch (Exception ex)
                    {
                        _log.Write("迁移租户数据库过程中出错:");
                        _log.Write(ex.ToString());
                        _log.Write("跳过此租户, 并将继续为其他租户迁移数据...");
                    }

                    migratedDatabases.Add(tenant.ConnectionString);
                }
                else
                {
                    _log.Write("此数据库以前已经迁移过 (同一数据库中有多个租户)。跳过它..。");
                }

                _log.Write(string.Format("租户数据库迁移已完成. ({0} / {1})", (i + 1), tenants.Count));
                _log.Write("--------------------------------------------------------");
            }

            _log.Write("所有数据库都已迁移。");

            return(true);
        }