我正在使用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属性。
答案 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。