objects detail collection c# wcf linq-to-entities automapper

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í ...