此处的目标是忽略空源值,同时不要求源对象具有目标对象具有的所有字段。只有在对象之间匹配所有字段时,防止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
如果我从映射定义中删除&#34; .ForAllMembers(opt =&gt; opt.Condition(src =&gt;!src.IsSourceValueNull));&#34; ,我没有得到错误,但是.Name属性将被覆盖为null。 我在这里缺少什么来让AutoMapper跳过目标对象上存在的属性而不是源对象?
答案 0 :(得分:7)
这解决了!
https://github.com/AutoMapper/AutoMapper/issues/432
引用文章
我们刚刚从3.0.0升级到3.1.0并开始遇到以下定义的映射问题:
.ForAllMembers(o =&gt; o.Condition(c =&gt;!c.IsSourceValueNull));这是 以前正常运作,不会尝试映射 没有源值的属性。升级后,它 似乎是Automapper,当面对目标成员时 没有匹配的源成员,将尝试从源类型映射到 目的地成员。然后抛出一个映射异常,因为 源类型没有任何映射定义 目的地属性类型。以前,Automapper似乎 理所当然地忽略没有匹配的源成员的成员。
We changed the condition line to:
.ForAllMembers(o => o.Condition(c => c.PropertyMap.SourceMember != null && !c.IsSourceValueNull));