AutoMapper mapping two models to one viewmodel

1k views Asked by At

I have two models and one view model.

Model:

public User
{
    public string UserName {  get; set; }
    public int RoleId {  get; set; }
}

public Role
{
    public int RoleId {  get; set; }
    public string Name {  get; set; }
}

ViewModel:

public UserIndex
{
    public string UserName {  get; set; }
    public string RoleName {  get; set; }
}

I tried to add config:

public class Role_User_UserIndex : Profile
{
    public Role_User_UserIndex()
    {
        CreateMap<User, UserIndex>();
        CreateMap<Role, UserIndex>()
            .ForMember(des => des.RoleName, opt => opt.MapFrom(src => src.Name));
        CreateMap<UserIndex, UserIndex>()
            .ForMember(des => des.RoleName, opt => opt.MapFrom(src => src.RoleName))
            .ForAllMembers(o => o.Condition((source, destination, member) => member != null));
    }
}

and controller:

        var mapper = new MapperConfiguration(cfg =>cfg.AddProfile<AutoMapperConfig.Role_User_UserIndex>()).CreateMapper();
        var roles = db.Roles;
        var users = db.Users;
         
        var viewMode1 = mapper.Map<List<UserIndex>>(users);
        var viewMode2 = mapper.Map<List<UserIndex>>(roles);
        var indexViewModel= mapper.Map(viewModel, viewMode2);

The viewMode1 has 10 users, and the viewMode2 has 3 roles.

However, the merged result indexViewModel has 10 rows data, but the RoleName is null.

If I swap viewModel with viewMode2, indexViewModel has 3 rows data and UserName is null.

I also tried to remove ".ForAllMembers(o => o.Condition((source, destination, member) => member != null));" , but still not working.

How can I map RoleName to indexViewModel?

My AutoMapper version is 9.0.0.

Thanks!

0

There are 0 answers