AutoMapper ReverseMap 反转映射(反向映射)
概念
ReverseMap():基于已有的正向映射,自动生成反向映射配置。
从 AutoMapper 6.1+ 支持,同时支持 Unflattening(反扁平化):Dto扁平字段可以反向写回实体里面嵌套对象的属性。
实体与DTO
// 业务实体(嵌套对象)
public class Order
{
public decimal Total { get; set; }
public Customer Customer { get; set; }
}
public class Customer
{
public string Name { get; set; }
}
// DTO:扁平化,把 Customer.Name 压扁成 CustomerName
public class OrderDto
{
public decimal Total { get; set; }
public string CustomerName { get; set; }
}Code language: JavaScript (javascript)
配置 ReverseMap
Mapper.Initialize(cfg =>
{
// Order → OrderDto 正向映射,加上 ReverseMap() 自动生成 OrderDto → Order反向映射
cfg.CreateMap<Order, OrderDto>()
.ReverseMap();
});Code language: JavaScript (javascript)
- 正向:
Order→OrderDto:把Order.Customer.Name扁平化赋值给OrderDto.CustomerName - 反向:
OrderDto→Order(Unflattening反扁平化):把Dto的CustomerName写回到Order.Customer.Name,自动实例化Customer对象。
完整示例
// 原始实体
var customer = new Customer
{
Name = "Bob"
};
var order = new Order
{
Customer = customer,
Total = 15.8m
};
// 正向映射 Entity → DTO
var orderDto = Mapper.Map<Order, OrderDto>(order);
// 修改DTO的扁平字段
orderDto.CustomerName = "Joe";
// 反向映射 DTO → Entity,反扁平化
Mapper.Map(orderDto, order);
// 输出 Joe,反向把CustomerName写回嵌套对象 Customer.Name
Console.WriteLine(order.Customer.Name);Code language: JavaScript (javascript)
ReverseMap 自定义反向规则
如果反向映射需要额外配置,在ReverseMap()后面链式调用ForMember:
cfg.CreateMap<Order, OrderDto>()
.ForMember(dto => dto.Total, opt => opt.MapFrom(src => src.Total))
.ReverseMap()
// 只针对反向映射 OrderDto → Order 的配置
.ForMember(dest => dest.Total, opt => opt.Ignore());Code language: JavaScript (javascript)
Profile类写法
public class OrderMappingProfile : Profile
{
public OrderMappingProfile()
{
CreateMap<Order, OrderDto>()
.ReverseMap();
}
}Code language: HTML, XML (xml)