Básicamente tengo esta clase que representa 1: 1 con mi base de datos

public class User
{
    public int UserID { get; set; }
    public string Username { get; set; }
    public string Role { get; set; }
}

Y tengo esta modelo de vista Y tengo este modelo de vista

public class UserEditViewModel
{
    public UserEditViewModel()
    {
        Roles = new List<string>();
    }

    public int UserID { get; set; }
    [Required]
    public string Username { get; set; }
    [Required]
    public List<string> Roles { get; set; }
}

No tengo idea de cómo mapear entre estos 2. Mi configuración actual:

Mapper.CreateMap<UserEditViewModel, User>().ReverseMap();
8
warheat1990 26 ene. 2016 a las 10:28

3 respuestas

La mejor respuesta

Hay algo similar a su pregunta aquí. ¿Puede consultar esto AutoMapper: Collection to Single Propiedad de cadena

PD: Este es un ejemplo para mapear la colección a la propiedad de una sola cadena, probablemente su ejemplo debería verse a continuación;

Mapper.CreateMap<User, UserEditViewModel>()
    .ForMember(dest => dest.Roles,
    m => m.MapFrom(src => src.Role.Split(',').ToList()));

Y mapeando las instancias como a continuación;

User myUser = new User();
myUser.Role = "r1,r2,r3,r4,r5";
myUser.UserID = 1;
myUser.Username = "MyUserName";

UserEditViewModel result = Mapper.Map<UserEditViewModel>(myUser);

enter image description here

Edición 2020: dado que la API de Expression.Call no admite el parámetro opcional y debe reemplazar src.Role.Split(',') con src.Role.Split(',', System.StringSplitOptions.None) o src.Role.Split(',', System.StringSplitOptions.RemoveEmptyEntries)

7
Cihan Uygun 27 ago. 2020 a las 05:54

Creo que debería poder usar AutoMapper AfterMap, algo como esto:

.AfterMap((src,dest) => dest.Roles.Add(src.Role))

Crédito a la respuesta aquí: Asignar una propiedad a un elemento de colección

0
Community 23 may. 2017 a las 12:25

Si desea concatenar todos los valores en su lista de cadenas, debe usar string.Join. En el mapeador debe utilizar el método ForMember.

De UserEditViewModel a User:

Mapper.CreateMap<User, UserEditViewModel>().ForMember(user => user.Role, opt => opt.MapFrom(userEdit => string.Join(", ", userEdit.Roles)));

De User a UserEditViewModel:

Mapper.CreateMap<UserEditViewModel, User>().ForMember(userEdit => userEdit.Roles, opt => opt.MapFrom(user => user.Role.Split(",").ToList()));
0
erikscandola 26 ene. 2016 a las 07:52