如何让Automapper处理未找到的输入属性?

问题描述 投票:0回答:1

我有两个班级:

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对应。

现在怎么办?

c# oop reflection mapping automapper
1个回答
0
投票

如果 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();
© www.soinside.com 2019 - 2024. All rights reserved.