C# AutoMapper can';如果不是所有源属性都匹配,则不能阻止空源值

C# AutoMapper can';如果不是所有源属性都匹配,则不能阻止空源值,c#,mapping,automapper,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

这里的目标是忽略空源值,同时不要求源对象具有目标对象所具有的所有字段。只有在对象之间的所有字段都匹配的情况下,防止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
Mapper.CreateMap()
.ForAllMembers(opt=>opt.Condition(src=>!src.IsSourceValueNull));
var api=新的ApiStudent();
api.Id=123;
api.Name=null;
var domain=new domain student();
domain.Id=123;
domain.Name=“荷马·辛普森”;//目标是防止将其写入null
domain=Mapper.Map(api,domain);
//我在这里得到一个错误,说ApiStudent缺少SchoolId映射
如果我从映射定义中删除“.ForAllMembers(opt=>opt.Condition(src=>!src.IsSourceValueNull));”,我不会得到错误,但是.Name属性将被覆盖为null。 让AutoMapper跳过目标对象上存在的属性而不是源对象上的属性,我缺少了什么呢?

这就解决了问题

引用文章

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

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


谢谢,伙计-这正是我要找的。我在最新版本中没有看到属性
IsSourceValueNull
。您知道如何在当前版本中实现这一点吗?@MatheusLemos自动映射开发人员对自动映射的github发表了评论,称IsSourceValueNull已被删除,并且要使用!=而不是null。然而,我要指出,这似乎并不能解决我的问题。我相信这是因为null是寻找声明和分配为null的项,而不是像Adam Levitt所要求的那样完全未声明的项。
We changed the condition line to:

.ForAllMembers(o => o.Condition(c => c.PropertyMap.SourceMember != null && !c.IsSourceValueNull));