[英]AutoMapper Map Child Property that also has a map defined
I have the following Domain Object:我有以下域 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:我有以下两个对象,我想要 map 到:
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.如果我 map 我的 object 使用以下调用,则 parent.Child 属性为 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?有没有一种方法可以消除第二次调用并让 AutoMapper 为我执行此操作?
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)));
Just map the child using self.只需使用 self 映射孩子。 Tested with AutoMapper 6.1.1.使用 AutoMapper 6.1.1 测试。
CreateMap<DomainClass, Child>();
CreateMap<DomainClass, Parent>()
.ForMember(d => d.Child, opt => opt.MapFrom(s => s));
In Automapper 5.0 and above and if you are using Profile to create mapper:在 Automapper 5.0 及更高版本中,如果您使用 Profile 创建映射器:
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:其中目标ItemsDto
是:
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));
}
}
Try This Way:尝试这种方式:
_Mapper.Map<DomainClass, Child>();
_Mapper.Map<DomainClass, Parent>()
.ForMember(d => d.Child, opt => opt.MapFrom(s => s));
I faced this issue before the way I solved it is by bidirectional mapping 在我解决它的方式之前,我遇到了这个问题是通过双向映射
like this 像这样
mapper.CreateMap<ChildInputDto, Child>();
mapper.CreateMap<Child, ChildInputDto>();
I dont know why but it worked with me 我不知道为什么,但它与我合作
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.