c# - detail - automapper nested mapping
Ejemplo simple de Automapper (2)
1- Cambia el GroupD para que sea así:
[DataContract]
public class GroupDto
{
[DataMember]
public int id { get; set; }
[DataMember]
public string name{ get; set; }
[DataMember]
public List<UserDTO> Users { get; set; }
}
2- Crea tus asignaciones:
Mapper.CreateMap<User, UserDto>();
Mapper.CreateMap<UserDto, User>(); // Only if you convert back from dto to entity
Mapper.CreateMap<Group, GroupDto>();
Mapper.CreateMap<GroupDto, Group>(); // Only if you convert back from dto to entity
3- eso es todo, porque el asignador automático asignará automáticamente la List<User>
a la List<UserDto>
(ya que tienen el mismo nombre y ya existe una asignación de usuario a UserDto)
4- Cuando quieras mapear llamas:
Mapper.Map<GroupDto>(groupEntity);
Espero que ayude.
Me está costando entender cómo mapear ciertos objetos. Por favor responda algunas preguntas sobre este ejemplo simple.
Código de ejemplo
class User
{
private int id;
private string name;
}
class Group
{
private int id;
private string name;
private List<User> users;
}
[DataContract]
public class UserDto
{
[DataMember]
public int id { get; set; }
[DataMember]
public string name{ get; set; }
}
[DataContract]
public class GroupDto
{
[DataMember]
public int id { get; set; }
[DataMember]
public string name{ get; set; }
[DataMember]
public List<User> Users { get; set; }
}
Los mapeadores
Mapper.CreateMap<User, UserDto>();
Mapper.CreateMap<UserDto, User>();
Mapper.CreateMap<Group, GroupDto>();
Mapper.CreateMap<GroupDto, Group>();
Al asignar Group
to GroupDto
, ¿tiene que asignar User
a UserDto
internamente porque la List<User>
en Group
consiste en Users
sin mapear? Si es así, ¿cómo haces esto? Mi suposicion es
Mapper.CreateMap<Group, GroupDto>()
.ForMember(g => g.id, opt => opt.Ignore());
.ForMember(g => g.name, opt => opt.Ignore());
.ForMember(g => g.Users, opt => opt.MapFrom(u => Mapper.Map<Group, UserDto>(u)))
¿Es esto correcto?
Como dijo @stuartd, si cambias:
[DataContract]
public class GroupDto
{
[DataMember]
public int id { get; set; }
[DataMember]
public string name{ get; set; }
[DataMember]
public List<User> Users { get; set; }
}
para :
[DataContract]
public class GroupDto
{
[DataMember]
public int id { get; set; }
[DataMember]
public string name{ get; set; }
[DataMember]
public List<UserDTO> Users { get; set; }
}
Solo necesitas :
Mapper.CreateMap ()
De lo contrario, cambiar
Mapper.CreateMap<Group, GroupDto>()
.ForMember(g => g.id, opt => opt.Ignore());
.ForMember(g => g.name, opt => opt.Ignore());
.ForMember(g => g.Users, opt => opt.MapFrom(u => Mapper.Map<Group, UserDto>(u)))
para algo como:
Mapper.CreateMap<Group, GroupDto>()
.ForMember(g => g.id, opt => opt.Ignore());
.ForMember(g => g.name, opt => opt.Ignore());
.ForMember(g => g.Users, opt => opt.MapFrom(u => Mapper.Map<List<User>>(g.Users)))
Esto no ha sido probado, pero la idea está aquí ...