tutorial standard net mvc imapper framework example custom c# automapper

c# - standard - AutoMapper Map Child Property que también tiene un mapa definido



imapper c# (4)

Tengo el siguiente objeto de dominio:

public class DomainClass { public int Id { get; set; } public string A { get; set; } public string B { get; set; } }

Tengo los dos objetos siguientes a los que quiero asignar:

public class Parent { public int Id { get; set; } public string A { get; set; } public Child Child { get; set; } } public class Child { public int Id { get; set; } public string B { get; set; } }

Configuré los siguientes mapas:

Mapper.CreateMap<DomainClass, Parent>(); Mapper.CreateMap<DomainClass, Child>();

Si mapeo mi objeto usando la siguiente llamada, la propiedad parent.Child es nula.

var domain = GetDomainObject(); var parent = Mapper.Map<DomainClass, Parent>(domain); // parent.Child is null

Sé que puedo escribir lo siguiente:

var domain = GetDomainObject(); var parent = Mapper.Map<DomainClass, Parent>(domain); parent.Child = Mapper.Map<DomainClass, Child>(domain);

¿Hay alguna forma de que pueda eliminar esa segunda llamada y hacer que AutoMapper haga esto por mí?


En Automapper 5.0 y superior, y si está usando Profile para crear mapper:

public class OrderMapper : Profile { public OrderMapper() { CreateMap<Order, OrderDto>(MemberList.None) .ForMember(dest => dest.OrderId, opts => opts.MapFrom(src => src.OrderId)) .ForMember(dest => dest.OrderDate, opts => opts.MapFrom(src => src.OrderDate)) .ForMember(dest => dest.OrderedBy, opts => opts.MapFrom(src => src.OrderedBy)) .ForMember(dest => dest.ItemsDto, opt => opt.MapFrom(src => src.Items)); } }

donde Destino ItemsDto es un:

public List<OrderItemDto> ItemsDto { get; set; }

y los artículos fuente son:

public List<OrderItem> Items { get; set; }

A continuación, cree un perfil de asignador para la propiedad / elemento secundario:

public class OrderItemMapper : Profile { public OrderItemMapper() { CreateMap<OrderItem, OrderItemDto>(MemberList.None) .ForMember(dest => dest.ItemId, opts => opts.MapFrom(src => src.ItemId)) .ForMember(dest => dest.ItemPrice, opts => opts.MapFrom(src => src.ItemPrice)) .ForMember(dest => dest.Name, opts => opts.MapFrom(src => src.Name)) .ForMember(dest => dest.Quantity, opts => opts.MapFrom(src => src.Quantity)) .ForMember(dest => dest.ItemTotal, opts => opts.MapFrom(src => src.ItemTotal)); } }


Me enfrenté a este problema antes de la forma en que lo resolví mediante el mapeo bidireccional

Me gusta esto

mapper.CreateMap<ChildInputDto, Child>(); mapper.CreateMap<Child, ChildInputDto>();

No sé por qué, pero funcionó conmigo


Solo mapea al niño usando el auto. Probado con AutoMapper 6.1.1.

CreateMap<DomainClass, Child>(); CreateMap<DomainClass, Parent>() .ForMember(d => d.Child, opt => opt.MapFrom(s => s));


Solo necesita especificar eso en la asignación:

Mapper.CreateMap<DomainClass, Child>(); Mapper.CreateMap<DomainClass, Parent>() .ForMember(d => d.Id, opt => opt.MapFrom(s => s.Id)) .ForMember(d => d.A, opt => opt.MapFrom(s => s.A)) .ForMember(d => d.Child, opt => opt.MapFrom(s => Mapper.Map<DomainClass, Child>(s)));