0

I am configuring identity user, I have seeded users with roles by many to many relationship as follows:

public class AppUser : IdentityUser
{
    public string DisplayName { get; set;}
    public ICollection<AppUserRole> UserRoles { get; set;}
}

public class AppRole : IdentityRole
{
    public ICollection<AppUserRole> UserRoles { get; set; }
}

public class AppUserRole : IdentityUserRole<string>
{
    public AppUser User { get; set; }
    public AppRole Role { get; set; }
}

builder.Entity<AppUser>()
       .HasMany(ur => ur.UserRoles)
       .WithOne(u => u.User)
       .HasForeignKey(ur => ur.UserId)
       .IsRequired();

builder.Entity<AppRole>()
       .HasMany(ur => ur.UserRoles)
       .WithOne(u => u.Role)
       .HasForeignKey(ur => ur.RoleId)
       .IsRequired();

In the screenshot - why am I getting the shadow id UserId1, RoleId1?

Screenshot

I am trying to get all user with their respective roles or roles

public UsersController(UserManager<AppUser> userManager)
{ 
    _userManager = userManager;
}
             
public async Task<ActionResult> GetUsersWithRoles()
{
    var users = await _userManager.Users
                                  .Include(r => r.UserRoles)
                                  .ThenInclude(r => r.Role)
                                  // .OrderBy(u => u.UserName)
                                  .Select(u => new
                                               {
                                                   // u.Id,
                                                   Username = u.UserName,
                                                   DisplayName = u.DisplayName,
                                                   Role = u.UserRoles.Select(r => r.Role.Name).ToList()
                                               })
                                  .ToListAsync();

    return Ok(users);
}

I am getting the users with empty role array... but I think this code should work

Progman
  • 16,827
  • 6
  • 33
  • 48
King Genius
  • 51
  • 1
  • 1
  • 6

1 Answers1

0

i think you should add it in AppUserRole

 builder.HasKey(a => new { a.UserId, a.RoleId });

then this is ideal dto

public class DtoSelectedUsersAdmin 
    {
        public string UserName { get; set; }
        public string Password { get; set; }
        public string Gender { get; set; }
        public int Age { get; set; }
        public int AppRoleId { get; set; }
        public string AppRoleName { get; set; }
        
        public virtual ICollection<AppUserRole> AppRole { get; set; }

        public override void CustomMappings(IMappingExpression<AppUser, DtoSelectedUsersAdmin> mapping)
        {
                .ForMember(a => a.AppRoleName, s => s.MapFrom(q => q.Roles.FirstOrDefault().AppRole.Name))
                .ForMember(a => a.AppRoleId, s => s.MapFrom(q => q.Roles.FirstOrDefault().AppRole.Id));
        }
    }

and finally service class to get all users with their role

public async Task<List<DtoSelectedUsersAdmin>> GetAllUsersWithRolesAsync()
        {
            var result = await Users.Select(user => new DtoSelectedUsersAdmin
            {
                Id = user.Id,
                AppRole = user.Roles,
                UserName = user.UserName

            }).ToListAsync();
return result;
}