Check the docs before asking a question: https://docs.abp.io/en/commercial/latest/ Check the samples, to see the basic tasks: https://docs.abp.io/en/commercial/latest/samples/index The exact solution to your question may have been answered before, please use the search on the homepage.
- ABP Framework version: v2.8.0
- UI type: ~~Angular~~ / MVC
- Tiered (MVC) or Identity Server Seperated (Angular): yes / ~~no~~
- Exception message and stack trace: n.a.
- Steps to reproduce the issue: n.a.
- After succesfully creating the tenant database using an override of the function CreateAsync, we now want to seed the new database with new permissions. I thought of using a Seeder but the docs on the Seeder subject contain : 'ToDo'
Could you explain to me hwo I should add the permissons we have defined in the PermissionDefinitionProvider in the Application.Contracts ? The code we use now to create the tenant database looks like this :
[Dependency(ReplaceServices = true)]
[ExposeServices(typeof(ITenantAppService), typeof(KantanTenantAppService))]
public class KantanTenantAppService : TenantAppService
{
private readonly ITenantRepository _tenantRepository;
private readonly IEditionRepository _editionRepository;
private readonly ITenantManager _tenantManager;
private readonly IDataSeeder _dataSeeder;
private readonly ICurrentTenant _currentTenant;
private readonly IConfiguration _config;
public KantanTenantAppService(ITenantRepository tenantRepository,
IEditionRepository editionRepository,
ITenantManager tenantManager,
IDataSeeder dataSeeder,
ICurrentTenant currentTenant,
IConfiguration config) : base(
tenantRepository,
editionRepository,
tenantManager,
dataSeeder)
{
_tenantRepository = tenantRepository;
_editionRepository = editionRepository;
_tenantManager = tenantManager;
_dataSeeder = dataSeeder;
_currentTenant = currentTenant;
_config = config;
}
[Authorize("Saas.Tenants.Create")]
public override async Task<SaasTenantDto> CreateAsync(SaasTenantCreateDto input)
{
SaasTenantDto result;
string configConnectionString = _config.GetConnectionString("NewTenantConnectionString");
string newConnectionString = string.Empty;
Tenant tenant;
string dbPrefix = _config.GetSection(KantanConsts.TenantConfigSection)["Default"];
result = await base.CreateAsync(input);
tenant = _tenantRepository.FindByName(input.Name);
if (tenant != null)
{
newConnectionString =
string.Format(configConnectionString
,dbPrefix
,tenant.Id.ToString().Replace("-","")
);
//Create default connection string for this new tenant
await base.UpdateDefaultConnectionStringAsync(tenant.Id, newConnectionString);
using (_currentTenant.Change(tenant.Id))
{
await ServiceProvider.
GetRequiredService<KantanDbMigrationService>()
.MigrateTenantDatabasesAsync(tenant);
// Add the additional Permissions
//addpermissions
//Add other data
//DoSomething
}
}
return result;
}
}
The definition provider for the permissions looks like this (in the application.contracts)
public class KantanPermissionDefinitionProvider : PermissionDefinitionProvider { public override void Define(IPermissionDefinitionContext context) { PermissionGroupDefinition KantanGroup = context.AddGroup(KantanPermissions.GroupName); PermissionDefinition pd;
KantanGroup.AddPermission(KantanPermissions.Dashboard.Host, L("Permission:Dashboard"), MultiTenancySides.Host);
KantanGroup.AddPermission(KantanPermissions.Dashboard.Tenant, L("Permission:Dashboard"), MultiTenancySides.Tenant);
pd = KantanGroup.AddPermission(KantanPermissions.FinancialStatement.FinancialStatementGroup, L("Permission:FinancialStatementGroupName"), MultiTenancySides.Host);
pd.AddChild(KantanPermissions.FinancialStatement.FinancialStatement_Add, L("Permission:Add"), MultiTenancySides.Host);
pd.AddChild(KantanPermissions.FinancialStatement.FinancialStatement_Delete, L("Permission:Delete"), MultiTenancySides.Host);
pd.AddChild(KantanPermissions.FinancialStatement.FinancialStatement_Edit, L("Permission:Edit"), MultiTenancySides.Host);
pd.AddChild(KantanPermissions.FinancialStatement.FinancialStatement_Read, L("Permission:Read"), MultiTenancySides.Host);
}
private static LocalizableString L(string name)
{
return LocalizableString.Create<KantanResource>(name);
}
}
Basically we have two questions : 1 : How to add the permissions ? 2 : How to add other data to the tenant database ?
Do we need to use a seeder ? Thanks for your help.
3 Answer(s)
-
0
Hi,
Try :
using (_currentTenant.Change(tenant.Id)) { await ServiceProvider. GetRequiredService<KantanDbMigrationService>() .MigrateTenantDatabasesAsync(tenant); // init seed data await _dataSeeder.SeedAsync(tenant.Id); }
You can custom
DataSeedContributor
to add more seed data, Like this:public class CustomDataSeedContributor : IDataSeedContributor, ITransientDependency { private readonly IIdentityUserRepository _identityUserRepository; public CustomDataSeedContributor(IIdentityUserRepository identityUserRepository) { _identityUserRepository = identityUserRepository; } [UnitOfWork] public virtual async Task SeedAsync(DataSeedContext context) { _identityUserRepository.InsertAsync(...); } }
-
0
Hi liangshiwei,
Your first suggestion does not give the desired result. The SeedAsync is already called in the MigrateTenantDatabaseAsync. I think I need to take the second step and create a custom seeder.
But is there a way to use the KantanPermissionDefinitionProvider defined in the Application.Contracts ?
-
0
Hi,
Permission definitions are not persisted to the database. You can use
DataSeedContributor
add anything seed data.