将 AutoMapper 从 3 更新到 4 打破了继承映射

Updated AutoMapper from 3 to 4 broke inheritance mapping

我将 AutoMapper 从 3.3.1 更新到 4.0.4,这打破了以下带有此消息的映射

Unable to cast object of type 'Foo' to type 'BarDTO'

public class FooDTO
{
    // omitted
}

// derived DTO
public class BarDTO : FooDTO
{
    public string Extra { get; set; }
}

映射配置

Mapper.CreateMap<Foo, FooDTO>().ReverseMap();
Mapper.CreateMap<Foo, BarDTO>();

映射

Map<Foo, BarDTO>(foo); // throws cast exception

我也尝试过使用.Include()方法,但没有什么不同。

Mapper.CreateMap<Foo, FooDTO>()
      .Include<Foo, BarDTO>()
      .ReverseMap();
Mapper.CreateMap<Foo, BarDTO>();

我是不是做错了什么,或者是一个错误?

这是从 3.x.x 到 4 发生的已知更改。在 Mapper.Initialize 内配置映射可以解决问题。

例如 在 3.x.x 中,映射是这样完成的:

Mapper.CreateMap<Order, OrderDto>()
            .Include<OnlineOrder, OnlineOrderDto>()
            .Include<MailOrder, MailOrderDto>();
        Mapper.CreateMap<OnlineOrder, OnlineOrderDto>();
        Mapper.CreateMap<MailOrder, MailOrderDto>();

现在,在 4.x.x 中映射应该使用委托在 Initialize 方法中完成。

Mapper.Initialize(cfg =>
        {
            cfg.CreateMap<Order, OrderDto>()
                .Include<OnlineOrder, OnlineOrderDto>()
                .Include<MailOrder, MailOrderDto>();
            cfg.CreateMap<OnlineOrder, OnlineOrderDto>();
            cfg.CreateMap<MailOrder, MailOrderDto>();
        });

这是与 issue 相关的讨论。

Update ver: bug fixed for 4.1.0 milestone

或者,您可以密封映射。

Mapper.Configuration.Seal();