0

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!

Jackdaw
  • 7,626
  • 5
  • 15
  • 33
Ching Wang
  • 49
  • 8
  • You need `ProjectTo` instead of `Map`. Check http://docs.automapper.org/en/latest/Queryable-Extensions.html and https://docs.automapper.org/en/latest/Flattening.html. – Lucian Bargaoanu Jan 19 '21 at 08:31
  • @LucianBargaoanu Sorry... I don’t get it, because my class don't have subclass, I try to use this code but not working: var config = new MapperConfiguration(cfg => { cfg.CreateMap(); cfg.CreateMap().ForMember(des => des.RoleName, c => c.MapFrom(r => r.Name)); }).CreateMapper(); var destination = config.ProjectTo(users).ToList(); destination = config.ProjectTo(roles).ToList(); – Ching Wang Jan 20 '21 at 03:43
  • You'll have to add FK class properties. – Lucian Bargaoanu Jan 20 '21 at 05:29

0 Answers0