我正在尝试映射可为空的属性,但自动映射器指示此映射中存在错误。
属性:
HomeTown
来源:Person.NaturalPerson.HomeTown
目的地:
PersonDTO.NaturalPersonDTO.HomeTown
当源码中该属性为null时,会出现以下错误:
Mapping types:
Person -> PersonDTO
LogSistemas.Domynus.Application.Core.Entities.Person.Person -> LogSistemas.Domynus.Application.Core.Dto.Person.PersonDTO
Type Map configuration:
Person -> PersonDTO
LogSistemas.Domynus.Application.Core.Entities.Person.Person -> LogSistemas.Domynus.Application.Core.Dto.Person.PersonDTO
Destination Member:
NaturalPerson
---> AutoMapper.AutoMapperMappingException: Error mapping types.
Mapping types:
NaturalPerson -> NaturalPersonDTO
LogSistemas.Domynus.Application.Core.Entities.Person.NaturalPerson -> LogSistemas.Domynus.Application.Core.Dto.Person.NaturalPersonDTO
Type Map configuration:
NaturalPerson -> NaturalPersonDTO
LogSistemas.Domynus.Application.Core.Entities.Person.NaturalPerson -> LogSistemas.Domynus.Application.Core.Dto.Person.NaturalPersonDTO
Destination Member:
HomeTown
---> System.NullReferenceException: Object reference not set to an instance of an object.
课程
public class NaturalPerson
{
public NaturalPerson()
{
HomeTown = new();
}
public City HomeTown { get; set; }
}
public class NaturalPersonDTO
{
public NaturalPersonDTO()
{
HomeTown = new CityDTO();
}
public CityDTO HomeTown { get; set; }
}
映射配置
CreateMap<Entities.Person.Person, PersonDTO>();
CreateMap<Entities.Person.NaturalPerson, NaturalPersonDTO>();
CreateMap<City, CityDTO>()
.ConvertUsing(x => new CityDTO
{
Id = x.Id,
StateId = x.StateId,
Name = x.Name,
State = x.State.Abbreviation,
Country = x.State.Country.Name
});
据我所知,automapper 映射 null 没有任何问题。我无法弄清楚这一点。
通常,当您使用 DTO 时,您希望避免在其中定义行为。我看到的是,当您尝试将
NaturalPerson
映射到 NaturalPersonDTO
时,您正在将 HomeTown
属性重新初始化为新的 DTO,这可能是一个问题,因为您丢失了对象的初始 HomeTown
映射之前它所具有的属性。
尝试将
NaturalPersonDTO
修改为以下内容:
public class NaturalPersonDTO
{
public CityDTO HomeTown { get; set; }
}
归根结底,我强烈建议使用 DTO 记录,尤其是当您使用 API 时。
如果您想尝试一下,您的 DTO 将如下所示:
public record class NaturalPersonDTO(
CityDTO HomeTown);
我希望这有帮助!
您无法映射可为空的属性,因为您的映射器配置文件明确表示要从
CityDTO
创建新对象 City
。因此,当 City
为空时,映射器无法执行您告诉他的操作。
您需要将映射配置文件修改为如下所示:
...
CreateMap<Entities.Person.NaturalPerson, NaturalPersonDTO>();
CreateMap<City, CityDTO>()
.ForPath(dist => dist.State, op => op.MapFrom(src => src.State.Abbreviation))
.ForPath(dist => dist.Country, op => op.MapFrom(src => src.State.Country.Name));