AutoMapper Map Child Property that also has a map defined

I have the following Domain Object:

public class DomainClass
{
public int Id { get; set; }


public string A { get; set; }
public string B { get; set; }
}

I have the following two objects that I want to map to:

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; }
}

I set up the following maps:

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

If I map my object using the following call then the parent.Child property is null.

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

I know I can write the following:

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

Is there a way I can eliminate that second call and have AutoMapper do this for me?

90048 次浏览

You just need to specify that in the mapping:

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)));

In Automapper 5.0 and above and if you are using Profile to create 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));
}
}

where destination ItemsDto is a:

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

and source Items is a:

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

Then create a mapper profile for the child item/property:

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));
}


}

Just map the child using self. Tested with AutoMapper 6.1.1.

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

Try This Way:

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