跳过映射null属性

时间:2017-09-07 14:01:38

标签: c# automapper

我正在使用AutoMapper将ViewModel映射到模型。但是,如果相应的源属性为null,我希望不映射属性。

我的源类如下:

public class Source
{
    //Other fields...
    public string Id { get; set; } //This should not be mapped if null
}

目的地类是:

public class Destination
{
    //Other fields...
    public Guid Id { get; set; }
}

以下是我配置映射器的方法:

Mapper.Initialize(cfg =>
{
    //Other mappings...
    cfg.CreateMap<Source, Destination>()
        .ForAllMembers(opts => opts.Condition((src, dest, srcMember) => srcMember != null));
});

我认为映射意味着如果源null,属性不会被覆盖在目标中。但显然我错了:即使Source.Id为空,它仍然被映射,AutoMapper会为它分配一个空的Guid(00000000-0000-0000-0000-000000000000),覆盖现有的Guid。如果源为空,如何正确告诉AutoMapper跳过属性的映射?

注意:我不认为这是Guid<->String转换的问题,这种转换适用于automapper,我在传递中使用过它。问题是,当它为null时,它不会跳过Id属性。

1 个答案:

答案 0 :(得分:6)

简单的方法是不必区分null和Guid.Empty。喜欢这个

    cfg.CreateMap<Source, Destination>()
        .ForAllMembers(opts => opts.Condition((src, dest, srcMember) => ((Guid)srcMember) != Guid.Empty));

在这种情况下,源成员不是您映射的字符串值,它是将分配给目标的已解析值。它的类型是Guid,一个结构,所以它永远不会为null。空字符串将映射到Guid.Empty。请参阅here