- ABP Framework version: v7.3.3
- UI Type: MVC
- Database System: EF Core
- Tiered (for MVC) or Auth Server Separated (for Angular): yes
When I seed data for a new tenant, how can I get the edition? I tried using a feature of the edition with the feature checker, but that value is only set to the default value and isn't pulling in the correct editions feature. What is the proper way when data seeding to do this?
In my data seeder I am doing this:
var featureName = await _featureChecker.GetOrNullAsync("FeatureName");
But it is always just the default value.
Thanks!
14 Answer(s)
-
0
hi
Please share more code. Thanks
-
0
First, I created a new feature using this:
var myGroup = context.AddGroup("Version"); myGroup.AddFeature( "Version", defaultValue: "V1", displayName: LocalizableString .Create<MaestroCoreResource>("My.Version"), valueType: new SelectionStringValueType { ItemSource = new StaticSelectionStringValueItemSource( new LocalizableSelectionStringValueItem { Value = "V1", DisplayText = new LocalizableStringInfo("MyResource", "My.Version.V1") }, new LocalizableSelectionStringValueItem { Value = "V2", DisplayText = new LocalizableStringInfo("MyResource", "My.Version.V2") }), Validator = new AlwaysValidValueValidator() } );
Then, when I create a Tenant, I am choosing "V2" for my Version feature.
When it seeds the data, I want to do specific seeding based on that version:
var version = await _featureChecker.GetOrNullAsync("Version"); if(version == "V2") { //do something for V2 } else { //do something for V1 }
I would expect the code of:
await _featureChecker.GetOrNullAsync("Version");
Would return the correct version, but no matter what it always returns the default value set in the feature. -
0
hi
Does
CurrentTenant
set the correct tenant?https://docs.abp.io/en/abp/latest/Multi-Tenancy#change-the-current-tenant
-
0
Im not sure I understand what you are asking. The tenant id that gets passed into the data seeding is the correct Id, and all the seeded items have the correct tenant id. I do not use currenttenant in the data seeding.
Can you be more specific as to what you are asking?
-
0
Ok, Can you share the full code so I can understand your case? Thanks
-
0
using System; using System.Collections.Generic; using System.Linq; using System.Security.Principal; using System.Text; using System.Threading.Tasks; using Volo.Abp.Authorization.Permissions; using Volo.Abp.Data; using Volo.Abp.DependencyInjection; using Volo.Abp.Features; using Volo.Abp.Identity; using Volo.Abp.MultiTenancy; using Volo.Abp.PermissionManagement; using Volo.Abp.Security.Claims; using Volo.Saas.Tenants; namespace MyCore.DataSeedContributors { public class AddAbpRoleDataSeedContributor : IDataSeedContributor, ITransientDependency { private readonly IdentityUserManager _identityUserManager; private readonly IdentityRoleManager _identityRoleManager; private readonly IPermissionDataSeeder _permissionDataSeeder; private readonly IFeatureChecker _featureChecker; private readonly IPermissionDefinitionManager _permissionDefinitionManager; public AddAbpRoleDataSeedContributor(IdentityUserManager identityUserManager, IdentityRoleManager identityRoleManager, IPermissionDataSeeder permissionDataSeeder, IFeatureChecker featureChecker, IPermissionDefinitionManager permissionDefinitionManager) { _identityUserManager = identityUserManager; _identityRoleManager = identityRoleManager; _permissionDataSeeder = permissionDataSeeder; _featureChecker = featureChecker; _permissionDefinitionManager = permissionDefinitionManager; } public async Task SeedAsync(DataSeedContext context) { var version = await _featureChecker.GetOrNullAsync("Version"); if(version == "V2") { //dosomething for V2 } else { //dosomthing for V1 } } } }
In addition to this, I really want to know what Edition the tenant I just created is using, but I can't seem to find a way to it.
-
0
hi
You can try to get a feature value of a tenant by
GetOrNullForTenantAsync
method ofIFeatureManager
.https://github.com/abpframework/abp/blob/dev/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/TenantFeatureManagerExtensions.cs#L11
-
0
Same result, just returns the default value of the feature.
-
0
Maybe part of the problem is the tenant record doesnt exist in the database yet when the dataseeder runs?
-
0
hi
public class AddAbpRoleDataSeedContributor : IDataSeedContributor, ITransientDependency { private readonly IdentityUserManager _identityUserManager; private readonly IdentityRoleManager _identityRoleManager; private readonly IPermissionDataSeeder _permissionDataSeeder; private readonly IFeatureChecker _featureChecker; private readonly IFeatureManager _featureManager; private readonly IPermissionDefinitionManager _permissionDefinitionManager; private readonly ICurrentPrincipalAccessor _currentPrincipalAccessor; private readonly ITenantRepository _tenantRepository; public AddAbpRoleDataSeedContributor(IdentityUserManager identityUserManager, IdentityRoleManager identityRoleManager, IPermissionDataSeeder permissionDataSeeder, IFeatureChecker featureChecker, IPermissionDefinitionManager permissionDefinitionManager, IFeatureManager featureManager, ICurrentPrincipalAccessor currentPrincipalAccessor, ITenantRepository tenantRepository) { _identityUserManager = identityUserManager; _identityRoleManager = identityRoleManager; _permissionDataSeeder = permissionDataSeeder; _featureChecker = featureChecker; _permissionDefinitionManager = permissionDefinitionManager; _featureManager = featureManager; _currentPrincipalAccessor = currentPrincipalAccessor; _tenantRepository = tenantRepository; } public async Task SeedAsync(DataSeedContext context) { if (context.TenantId.HasValue) { var tenant = await _tenantRepository.FindByIdAsync(context.TenantId.Value); var myPrincipal = _currentPrincipalAccessor.Principal.Clone(); myPrincipal.Identities.First().AddClaim(new Claim(AbpClaimTypes.TenantId, tenant.Id.ToString())); if (tenant.EditionId.HasValue) { myPrincipal.Identities.First().AddClaim(new Claim(AbpClaimTypes.EditionId, tenant.EditionId.ToString())); } using (_currentPrincipalAccessor.Change(_currentPrincipalAccessor.Principal)) { var version = await _featureChecker.GetOrNullAsync(IdentityProFeature.EnableLdapLogin); var version2 = await _featureManager.GetOrNullForTenantAsync(IdentityProFeature.EnableLdapLogin, context.TenantId.Value); if(version == "V2") { //dosomething for V2 } else { //dosomthing for V1 } } } } }
-
0
I will add code to the abp framework to fix this case.
-
0
-
0
I took a different approach and modified the MigrateAndSeedForTenantAsync method. Using:
var version = await _featureManager.GetOrNullForTenantAsync("Version", tenantId);
seems to have the correct value, so I added a property: ` // Seed data using (var uow = _unitOfWorkManager.Begin(requiresNew: true, isTransactional: true)) { await _dataSeeder.SeedAsync( new DataSeedContext(tenantId) .WithProperty(IdentityDataSeedContributor.AdminEmailPropertyName, adminEmail) .WithProperty(IdentityDataSeedContributor.AdminPasswordPropertyName, adminPassword) .WithProperty("Version", version) );await uow.CompleteAsync();
} `
-
0
Hi,
It looks fine.