问题
given this mapping
_mapper.Map(personDto, person, opt => opt.ConfigureMap()
.ForAllMembers(opts => opts.Condition((src, dest, srcMember) => srcMember != null))
);
person before mapping
FirstName: "John"
LastName: "Doe"
Email: "John.Doe@gmail.com"
personDto before mapping
FirstName: "Jim"
LastName: "Denver"
Email: NULL
expected output person
FirstName: "Jim"
LastName: "Denver"
Email: "John.Doe@gmail.com"
actual output person
FirstName: "Jim"
LastName: "Denver"
Email: NULL
mapper came from this post https://stackoverflow.com/a/43947731/3511012
Update, I also tried using ResolveUsing and it has the same output
_mapper.Map(personUpdateDto, person, opt => opt.ConfigureMap()
.ForAllOtherMembers(opts => opts.ResolveUsing((src, dest, srcMember, dstMember) => srcMember ?? dstMember))
);
回答1:
If I understand correctly then you have a predefined mapping from PersonDto to Person and trying to configure that mapping in the Map method. In that case, the code below really doesn't work as you want because the lambda in the ForAllMembers is never being called.
var config = new MapperConfiguration(cfg => cfg.CreateMap<PersonDto, Person>());//.ForAllMembers(opts => opts.Condition((src, dest, srcMember) => srcMember != null)));
var mapper = config.CreateMapper();
var person = new Person { FirstName = "John", LastName = "Snow" ,Email="test@mail.com"};
var personUpdateDto = new PersonDto { FirstName = "Jim", LastName = "Denver" };
var a = mapper.Map(personUpdateDto, person, opt => opt.ConfigureMap()
.ForAllMembers(opts => opts.Condition((src, dest, srcMember) =>
{
return srcMember != null;
}
)));
But the code below works as you want:
var config = new MapperConfiguration(cfg => cfg.CreateMap<PersonDto, Person>().ForAllMembers(opts => opts.Condition((src, dest, srcMember) => srcMember != null)));
var mapper = config.CreateMapper();
var person = new Person { FirstName = "John", LastName = "Snow", Email = "test@mail.com" };
var personUpdateDto = new PersonDto { FirstName = "Jim", LastName = "Denver" };
var a = mapper.Map(personUpdateDto, person);
Another way to work with inline maps is to define empty mapper configuration and then add inline maps:
var config = new MapperConfiguration(cfg => { });
var mapper = config.CreateMapper();
var person = new Person { FirstName = "John", LastName = "Snow", Email = "test@mail.com" };
var personUpdateDto = new PersonDto { FirstName = "Jim", LastName = "Denver" };
var a = mapper.Map(personUpdateDto, person,opts=>opts.ConfigureMap()
.ForAllMembers(opts2 => opts2.Condition((src, dest, srcMember) =>
{
return srcMember != null;
}
)));
来源:https://stackoverflow.com/questions/54677087/automapper-skip-all-members-on-source-that-are-null