我有两个班级:
CustomerLocation
和UILocation
。两者都有一个称为 Product
的属性,但在这两种情况下 Product
的类型是不同的。
我正在执行以下源代码,但收到一条错误消息:
try
{
UiLocation uiLocation = _mapper.Map<UiLocation>(customerLocation);
}
catch (Exception ex1)
{
_logger.Error($"An exception happened .... Exception message=[{ex1.Message}]");
}
异常消息:
Error mapping types.
Mapping types:
CustomerLocation -> UiLocation
Company.Customer.Server.Domain.CustomerLocation -> Company.Customer.Class.UiLocation
Type Map configuration:
CustomerLocation -> UiLocation
Company.Customer.Server.Domain.CustomerLocation -> Company.Customer.Class.UiLocation
Destination Member:
Product
]
据我了解,
mapper.Map
执行映射,这意味着原始对象的所有属性都被复制到具有相同名称的属性。如果提到的属性类型不同,则在那里完成相同的映射。
我的代码运行良好,但是在客户系统上执行时,我看到了提到的错误消息。显然
Product
属性的映射出了问题,但是什么???有人能给我指个方向吗?Product
:在DB中填写了一个ID,但该ID与实际产品不对应)。
一些见解后更新:
我添加了以下行(为了允许空目的地):
var locationConfiguration = new MapperConfiguration(cfg =>
{
cfg.AllowNullDestinationValues = true; // This allows AutoMapper to return null for any destination properties if the source is null
cfg.CreateMap<CustomerLocation, UiLocation>();
});
但是,这会导致整个映射不再起作用(即使产品没有任何问题)。
我还有什么办法呢? (来源不是
null
而是not found
:有一个ID,在DB中填写,但是没有数字,与该ID对应。
现在怎么办?
如果 Product 映射不重要,请忽略 Product 属性以避免错误:
cfg.CreateMap<CustomerLocation, UiLocation>()
.ForMember(dest => dest.Product, opt => opt.Ignore());
否则,您可以尝试自定义映射配置:
var locationConfiguration = new MapperConfiguration(cfg =>
{
cfg.CreateMap<CustomerLocation, UiLocation>()
.ForMember(dest => dest.Product, opt =>
{
opt.PreCondition(src => src.Product != null && src.Product.IsValid()); // Check if the Product is valid
opt.MapFrom(src => src.Product != null ? MapProduct(src.Product) : null); // Use a custom mapping function or set to null if not found
});
});
IMapper mapper = locationConfiguration.CreateMapper();