AutoMapper Map子属性,也定义了地图

Dis*_*ile 52 c# automapper

我有以下域对象:

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

    public string A { get; set; }
    public string B { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有以下两个要映射到的对象:

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; }
}
Run Code Online (Sandbox Code Playgroud)

我设置了以下地图:

 Mapper.CreateMap<DomainClass, Parent>();
 Mapper.CreateMap<DomainClass, Child>();
Run Code Online (Sandbox Code Playgroud)

如果我使用以下调用映射我的对象,则parent.Child属性为null.

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

我知道我可以写下面的内容:

var domain = GetDomainObject();
var parent = Mapper.Map<DomainClass, Parent>(domain);
parent.Child = Mapper.Map<DomainClass, Child>(domain);
Run Code Online (Sandbox Code Playgroud)

有没有办法可以消除第二次调用并让AutoMapper为我做这个?

Jus*_*ner 90

您只需在映射中指定:

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)));
Run Code Online (Sandbox Code Playgroud)

  • 只是与现在可能会看到这个的其他人对决.这将不再有效,如果你使用的是IOC容器来创建IMapper类的一个实例. (34认同)
  • 没想到在MapFrom里面调用Mapper.Map.谢谢 (9认同)
  • @PJH您仍可以使用`s =&gt; s`进行映射,请参见下面的答案 (3认同)
  • 在您的配置中调用Mapper.Map也会中断LINQ to Entities错误的ProjectTo。 (2认同)

pro*_*ick 31

只需使用self映射孩子.使用AutoMapper 6.1.1进行测试.

        CreateMap<DomainClass, Child>();
        CreateMap<DomainClass, Parent>()
            .ForMember(d => d.Child, opt => opt.MapFrom(s => s));
Run Code Online (Sandbox Code Playgroud)


all*_*tej 7

在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));
    }
}
Run Code Online (Sandbox Code Playgroud)

目的地ItemsDto是:

 public List<OrderItemDto> ItemsDto { get; set; }
Run Code Online (Sandbox Code Playgroud)

和源项目是:

  public List<OrderItem> Items { get; set; }
Run Code Online (Sandbox Code Playgroud)

然后为子项/属性创建映射器配置文件:

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

}
Run Code Online (Sandbox Code Playgroud)