如果并非所有源属性都匹配,则AutoMapper无法阻止空源值

Ada*_*itt 2 c# mapping automapper

这里的目标是忽略空源值,同时不要求源对象具有目标对象具有的所有字段.防止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; }
}
Run Code Online (Sandbox Code Playgroud)

当我运行以下映射时:

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
Run Code Online (Sandbox Code Playgroud)

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

Ada*_*itt 7

这解决了!

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));
Run Code Online (Sandbox Code Playgroud)