Open Closed

Extending the IdentityUser Object with Enum property #994


User avatar
0
nick.coleman created
  • 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)
  • User Avatar
    0
    nick.coleman created

    Did I ask this question incorrectly?

    If there is no answer to this can you close so I can claim my question back please

  • User Avatar
    0
    gterdem created
    Senior .NET Developer

    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; } );

    Which should result like this:

  • User Avatar
    0
    nick.coleman created

    Hi,

    Thanks but this doesn't compile for me?.

    Invalid expression term 'enum'

    Thanks

    Nick

  • User Avatar
    0
    gterdem created
    Senior .NET Developer

    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.

  • User Avatar
    0
    nick.coleman created

    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

  • User Avatar
    0
    gterdem created
    Senior .NET Developer

    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");
        }
    }
    

    This is AbpUsers table after adding then updating a user:

  • User Avatar
    0
    Mohammad created

    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.

  • User Avatar
    0
    gterdem created
    Senior .NET Developer

    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.

  • User Avatar
    0
    nick.coleman created

    @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 } ); });

  • User Avatar
    0
    Mohammad created

    How can we use the extended property in LINQ to query the database?

Boost Your Development
ABP Live Training
Packages
See Trainings
Mastering ABP Framework Book
The Official Guide
Mastering
ABP Framework
Learn More
Mastering ABP Framework Book
Made with ❤️ on ABP v9.3.0-preview. Updated on May 15, 2025, 10:28