我举一个例子来解释我的问题: 客户端(Angular)接收到一个PersonDto,其属性Address为null。现在,Address属性设置为AddressDto的实例,然后发送回服务器。在服务器上,接收到的PersonDto(源)的属性地址不同于null,我想将其映射到Person实体(目标)。但是目标仍然具有一个为null的Address属性。在映射期间,我希望automapper执行以下操作:
该源具有Address属性的新设置值(Id = 0)。 目标的Address属性的值仍为null。 在映射期间,我希望自动映射器为目标的Address属性创建一个Address的新实例,并将Address属性的值映射为源。
通过配置,这时我得到一个“错误映射类型。”但是,如果目标的Address属性已经有一个值,则映射可以正常工作。
这是代码:
我的模型和DTO:
public class Person
{
public int Id{ get; set; }
public string Name { get; set; }
public Address Address { get; set; }
}
public class PersonDto
{
public int Id{ get; set; }
public string Name { get; set; }
public AddressDto Address { get; set; }
}
public class Address
{
public int Id{ get; set; }
public string Street { get; set; }
}
public class AddressDto
{
public int Id{ get; set; }
public string Street { get; set; }
}
自动映射器的配置:
var config = new MapperConfiguration(cfg =>
{
cfg.AllowNullDestinationValues = true;
cfg.AddCollectionMappers();
cfg.CreateMap<PersonDto, Person>()
.EqualityComparison((odto, o) => odto.Id == o.Id)
.ForMember(d => d.FirstName, o => o.MapFrom(s => s.FirstName))
.ForMember(d => d.Address, o => o.MapFrom(s => s.Address))
cfg.CreateMap<AddressDto, Address>()
.EqualityComparison((odto, o) => odto.Id == o.Id)
.ForMember(d => d.Street, o => o.MapFrom(s => s.Street))
;
});
var personDto = new PersonDto();
personDto.FiscalAddress = new AddressDto();
personDto.FiscalAddress.street = "Teststreet";
var person = new Person();
// I leave person.Address as null
IMapper iMapper = config.CreateMapper();
iMapper.Map(itemFromClient, _Query);
非常感谢您的提示!