将 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();
我将 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();