ABP 5.3.1 Anuglar
I've create a new module now I need to test in multitenant.
I switch the tenant switch on API side but when I try to create a new tenant doesn't create the admin user
19 Answer(s)
- 
    0hi Can you share your details steps? 
- 
    0Hi step to reproduce: - create new empty module (v 5.3.1 with Angular UI and separated IDS)
- set multi tenant = true on shared module
- start IDS+API+UI
- login as admin
- create a new tenant
- try to login with in the new tenant
 You get an error because admin user doesn't exists. So if you look into db the user admin for tenant not exists 
- 
    0Can you check your app( IDS+API) logs? Are there any errors?
- 
    0No I don't have any error and tenant exists 
- 
    0hi Can you try with a new template? 5.3.4 or 6.0.0-rc.5 
- 
    0ok I can try with 5.3.4 
- 
    0I try in 5.3.4 same result! 
- 
    0ok, Please share your test project with me liming.ma@volosoft.com 
- 
    0I send the solution via wetransfert 
- 
    0hi I don't receive the mail. Can you check? 
- 
    0Hi I check it and resend via weTransfer. Let me know if you don't receive 
- 
    0Hi Any update? 
- 
    0hi I will check it asap. 
- 
    0hi Please create a same name app-proproject and copyMyProjectNameTenantDatabaseMigrationHandlerto yourDm.DynamicTemplate.IdentityServerproject.
- 
    0Hi I try but miss a lot of function like saas. It s not complete solution for test module in saas 
- 
    0hi I will share the code. Please wait. 
- 
    0Any update? 
- 
    0hi sorry for delay, I will share code asap 
- 
    0hi Add MyProjectNameTenantDatabaseMigrationHandlerto yourDm.DynamicTemplate.IdentityServerproject.using System; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using MyCompanyName.MyProjectName.EntityFrameworkCore; using Volo.Abp.Data; using Volo.Abp.DependencyInjection; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EventBus.Distributed; using Volo.Abp.MultiTenancy; using Volo.Abp.Uow; namespace MyCompanyName.MyProjectName.Data; public class MyProjectNameTenantDatabaseMigrationHandler : IDistributedEventHandler<TenantCreatedEto>, IDistributedEventHandler<TenantConnectionStringUpdatedEto>, IDistributedEventHandler<ApplyDatabaseMigrationsEto>, ITransientDependency { private readonly IDbContextProvider<AuthServerHostMigrationsDbContext> _dbContextProvider; private readonly ICurrentTenant _currentTenant; private readonly IUnitOfWorkManager _unitOfWorkManager; private readonly IDataSeeder _dataSeeder; private readonly ITenantStore _tenantStore; private readonly ILogger<MyProjectNameTenantDatabaseMigrationHandler> _logger; public MyProjectNameTenantDatabaseMigrationHandler( IDbContextProvider<AuthServerHostMigrationsDbContext> dbContextProvider, ICurrentTenant currentTenant, IUnitOfWorkManager unitOfWorkManager, IDataSeeder dataSeeder, ITenantStore tenantStore, ILogger<MyProjectNameTenantDatabaseMigrationHandler> logger) { _dbContextProvider = dbContextProvider; _currentTenant = currentTenant; _unitOfWorkManager = unitOfWorkManager; _dataSeeder = dataSeeder; _tenantStore = tenantStore; _logger = logger; } public async Task HandleEventAsync(TenantCreatedEto eventData) { await MigrateAndSeedForTenantAsync(eventData.Id); } public async Task HandleEventAsync(TenantConnectionStringUpdatedEto eventData) { if (eventData.ConnectionStringName != ConnectionStrings.DefaultConnectionStringName || eventData.NewValue.IsNullOrWhiteSpace()) { return; } await MigrateAndSeedForTenantAsync(eventData.Id); /* You may want to move your data from the old database to the new database! * It is up to you. If you don't make it, new database will be empty * (and tenant's admin password is reset to 1q2w3E*). */ } public async Task HandleEventAsync(ApplyDatabaseMigrationsEto eventData) { if (eventData.TenantId == null) { return; } await MigrateAndSeedForTenantAsync(eventData.TenantId.Value); } private async Task MigrateAndSeedForTenantAsync(Guid tenantId) { try { using (_currentTenant.Change(tenantId)) { // Create database tables if needed using (var uow = _unitOfWorkManager.Begin(requiresNew: true, isTransactional: false)) { var tenantConfiguration = await _tenantStore.FindAsync(tenantId); if (tenantConfiguration?.ConnectionStrings != null && !tenantConfiguration.ConnectionStrings.Default.IsNullOrWhiteSpace()) { await (await _dbContextProvider.GetDbContextAsync()).Database.MigrateAsync(); } await uow.CompleteAsync(); } // Seed data using (var uow = _unitOfWorkManager.Begin(requiresNew: true, isTransactional: true)) { await _dataSeeder.SeedAsync(new DataSeedContext(tenantId)); await uow.CompleteAsync(); } } } catch (Exception ex) { _logger.LogException(ex); } } }

 
                                