- ABP Framework version: v4.2.1
- UI type: MVC
- DB provider: EF Core
- Tiered (MVC) or Identity Server Separated (Angular): no
- Exception message and stack trace:
- Steps to reproduce the issue:
Hi,
I am extending the IdentityUser Object to add some custom properties and have successfully added a few following the advice here:
https://docs.abp.io/en/abp/latest/Module-Entity-Extensions https://community.abp.io/articles/how-to-add-custom-property-to-the-user-entity-6ggxiddr
However I hit a problem If I want to add a property of type Enum, for example :
user.AddOrUpdateProperty<Title>(
UserConsts.TitleName,
options =>
{
options.Attributes.Add(new RequiredAttribute());
options.UI.OnTable.IsVisible = false;
}
);
where 'Title' is the Enum :
public enum Title
{
Mr = 0,
Mrs = 1,
Ms = 2,
Dr = 2
}
When creating the UI to manage the user I get the following error...
An unhandled exception occurred while processing the request.
Exception: No items provided for select attribute.
Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.AbpSelectTagHelperService.GetSelectItems(TagHelperContext context, TagHelperOutput output)
How do I instruct the UI to get the select elements from the values of the Enum?
Many Thanks
10 Answer(s)
-
0
Did I ask this question incorrectly?
If there is no answer to this can you close so I can claim my question back please
-
0
Hello nick.coleman, sorry for late response.
It seems you have misconfiguration here:
user.AddOrUpdateProperty<Title>( UserConsts.TitleName, options => { options.Attributes.Add(new RequiredAttribute()); options.UI.OnTable.IsVisible = false; } );
Type should be enum instead of Title
user.AddOrUpdateProperty<
enum>( UserConsts.TitleName, options => { options.Attributes.Add(new RequiredAttribute()); options.UI.OnTable.IsVisible = false; } );
-
0
Hi,
Thanks but this doesn't compile for me?.
Invalid expression term 'enum'
Thanks
Nick
-
0
Hello,
I am sharing the configuration I tried to reproduce below:
Title.cs file under Domain.Shared:
public enum Title { Mr = 0, Mrs = 1, Ms = 2, Dr = 3 }
MyProjectNameModuleExtensionConfiguratior.cs under Domain.Shared: <br>
public static class BookStoreModuleExtensionConfigurator { private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); public static void Configure() { OneTimeRunner.Run(() => { ConfigureExistingProperties(); ConfigureExtraProperties(); }); } private static void ConfigureExistingProperties() { } private static void ConfigureExtraProperties() { ObjectExtensionManager.Instance.Modules() .ConfigureIdentity(identity => { identity.ConfigureUser(user => { user.AddOrUpdateProperty<Title>( "Title", options => { options.Attributes.Add(new RequiredAttribute()); options.UI.OnTable.IsVisible = false; } ); }); }); } }
<br> Your configuration is correct, my apologies. However i failed to reproduce the problem. I created two different usersvia New User modal under Administration->Identity Management->Users page. <br>
When creating the UI to manage the user I get the following error...
Can you explain more about this? Are you replacing Identity Management -> Users list/create/edit pages? If that is the case, you can check how extended properties are shown in User Create Modal.
-
0
Hi,
Thanks for the quick response... Im not replacing the UI.
I think it maybe due to the way i have the value configured in the DB? The modal works when the title is null in the DB but as soon as i save a user with a value for 'Title' field i can no longer open the modal for that user and i receive the error above.
Here is the EF configuration ; ObjectExtensionManager.Instance .MapEfCoreProperty<IdentityUser, string>( UserConsts.TitleName, (entityBuilder, propertyBuilder) => { propertyBuilder.HasMaxLength(UserConsts.TitleLength); } );
Does this look ok?
I can actually create users fine, I have managed to create users but as soon as i try and edit them i get the error... are you able to try this in your example?
Thanks
nick
-
0
It seems there is a problem with your EfCore configuration;
Here is my configuration under EntityFrameworkCore project: <br>
public static class BookStoreEfCoreEntityExtensionMappings { private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); public static void Configure() { BookStoreGlobalFeatureConfigurator.Configure(); BookStoreModuleExtensionConfigurator.Configure(); OneTimeRunner.Run(() => { ObjectExtensionManager.Instance .MapEfCoreProperty<IdentityUser, Title>( "Title", (entityBuilder, propertyBuilder) => { propertyBuilder.HasConversion<string>(); // If you want your Title to be seen as string } ); }); } }
This is the created migration under EntityFrameworkCore.DbMigrations project: <br>
public partial class Added_EfCore_Mapping : Migration { protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.AddColumn<string>( name: "Title", table: "AbpUsers", type: "nvarchar(max)", nullable: false, defaultValue: ""); } protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropColumn( name: "Title", table: "AbpUsers"); } }
-
0
Is the migration code generated automatically from the Efcore configuration or we need to manually write the migration code?
I have been following the above approach but the add-migration creates and empty migration file.
-
0
You need to add migration manually. Your new migration should have been generated automatically afterwards. You can check documentation for more.
I have been following the above approach but the add-migration creates and empty migration file.
That is the problably your EfCore configuration is not correct. Check the Configure method of MyProjectEfCoreEntityExtensionMappings under EntityFrameworkCore project.
-
0
@gterdem
Thanks you for your help!
This is now working....
This was the key part
OneTimeRunner.Run(() => { ObjectExtensionManager.Instance .MapEfCoreProperty<IdentityUser, Title>( "Title", (entityBuilder, propertyBuilder) => { propertyBuilder.HasConversion<string>(); // If you want your Title to be seen as string } ); });
-
0
How can we use the extended property in LINQ to query the database?