自动映射器不映射空值

问题描述 投票:0回答:2

我正在尝试映射可为空的属性,但自动映射器指示此映射中存在错误。

属性:

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 没有任何问题。我无法弄清楚这一点。

c# automapper
2个回答
0
投票

通常,当您使用 DTO 时,您希望避免在其中定义行为。我看到的是,当您尝试将

NaturalPerson
映射到
NaturalPersonDTO
时,您正在将
HomeTown
属性重新初始化为新的 DTO,这可能是一个问题,因为您丢失了对象的初始
HomeTown 
映射之前它所具有的属性。

尝试将

NaturalPersonDTO
修改为以下内容:

public class NaturalPersonDTO
{
    public CityDTO HomeTown { get; set; }
}

归根结底,我强烈建议使用 DTO 记录,尤其是当您使用 API 时。

如果您想尝试一下,您的 DTO 将如下所示:

public record class NaturalPersonDTO(
    CityDTO HomeTown);

我希望这有帮助!


0
投票

您无法映射可为空的属性,因为您的映射器配置文件明确表示要从

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));
© www.soinside.com 2019 - 2024. All rights reserved.