AutoMapper可以';如果不是所有源属性都匹配,则不会阻止空源值

本文关键字:属性 可以 如果不 AutoMapper | 更新日期: 2023-09-27 18:21:46

这里的目标是忽略空源值,同时不要求源对象具有目标对象所具有的所有字段。防止null似乎只有在对象之间的所有字段匹配时才有效。

public class ApiStudent {
    public long Id { get; set; }   
    public string Name { get; set; }    
}
public class DomainStudent {
    public long Id { get; set; }
    public string Name { get; set; }
    public long SchoolId { get; set; }
}

当我运行以下映射时:

Mapper.CreateMap<ApiStudent, DomainStudent>()   
    .ForAllMembers(opt => opt.Condition(src => !src.IsSourceValueNull));
var api = new ApiStudent();
api.Id = 123;
api.Name = null;
var domain = new DomainStudent();
domain.Id = 123;
domain.Name = "Homer Simpson"; // goal is to prevent this from being written to null
domain = Mapper.Map(api, domain);
// I get an error here saying the SchoolId mapping is missing from ApiStudent

如果我从映射定义中删除".ForAllMembers(opt=>opt.Condition(src=>!src.IsSourceValueNull));",我不会得到错误,但.Name属性将被覆盖为null。让AutoMapper跳过目标对象上而不是源对象上存在的属性,我缺少什么?

AutoMapper可以';如果不是所有源属性都匹配,则不会阻止空源值

这解决了它!

https://github.com/AutoMapper/AutoMapper/issues/432

引用文章

我们刚刚从3.0.0升级到3.1.0,并开始遇到以下定义的映射问题:

.ForAllMembers(o=>o.Condition(c=>!c.IsSourceValueNull));这是以前工作正常,不会尝试映射没有源值的属性。升级后似乎是Automapper,当面对具有没有匹配的源成员,将尝试从源类型映射到目标成员。然后抛出映射异常,因为没有源类型到目标属性类型。以前,Automapper似乎正确地忽略没有匹配源成员的成员。

We changed the condition line to:
.ForAllMembers(o => o.Condition(c => c.PropertyMap.SourceMember != null && !c.IsSourceValueNull));