Запретить Automapper создавать свойство объекта с нулевыми значениями

#c# #automapper

#c# #automapper

Вопрос:

Я использую Automapper с ядром EF. Объекты EF:

 public class Team
{
    public Guid? Id { get; set; }

    public string Name { get; set; }

    public Guid? OrganizationId { get; set; }

    public Organization Organization { get; set; }
}

public class Organization
{
    public Guid Id { get; set; }

    public string Name { get; set; }

    public ICollection<Team> Teams { get; set; }
}
 

И соответствующие DTO:

 public class TeamDto
{
    public Guid? Id { get; set; }

    public string Name { get; set; }

    public OrganizationDto Organization { get; set; }
}

public class OrganizationDto
{
    public Guid? Id { get; set; }

    public string Name { get; set; }
}
 

Сопоставления типов:

 cfg.CreateMap<Organization, OrganizationDto>();

cfg.CreateMap<TeamDto, Team>()
    .ForMember(teamEntity => teamEntity.Organization, opt => opt.Ignore())
    .ForMember(teamEntity => teamEntity.OrganizationId, opt => opt.MapFrom(
        orgDto => orgDto == null ? null : orgDto.Id))
    .ReverseMap();
 

Когда я пытаюсь сопоставить объект Team entity -> dto, когда Organization для объекта Team равно null, TeamDto имеет Organization свойство, отличное от null, с нулевыми значениями. например

 var team = new Team
{
    Name = "New Team"
};

// team.Organization is null as well as team.OrganizationId
var teamDto = s_mapper.Map<TeamDto>(team);   
 

введите описание изображения здесь

Это нежелательно, так как я хочу, чтобы Organization свойство TeamDto было нулевым.
Я попытался настроить это сопоставление через ForMember , но оно не вступило в силу:

 cfg.CreateMap<TeamDto, Team>()
    .ForMember(teamEntity => teamEntity.Organization, opt => opt.Ignore())
    .ForMember(teamEntity => teamEntity.OrganizationId, opt => opt.MapFrom(
        orgDto => orgDto == null ? null : orgDto.Id))
    .ReverseMap()
    .ForMember(teamDto => teamDto.Organization, opt => opt.MapFrom(
        teamEntity => teamEntity.Organization == null ? null : new OrganizationDto
    {
        Id = teamEntity.Organization.Id,
        Name = teamEntity.Organization.Name
    }));
 

Как я могу настроить это так, чтобы для Organization свойства было установлено значение null, когда источник также равен null.

Один из способов добиться этого — использовать AfterMap , но я ищу решение, которое можно применить ко всем таким случаям, не указывая AfterMap для каждого случая.

AutoMapper v. 9.0.0

Ответ №1:

Иногда ReverseMap просто мешает, как, похоже, здесь. Вы всегда можете избежать этого и просто явно создать обратную карту.

Ответ №2:

Вы можете использовать функцию подстановки Null в ForMember..

https://docs.automapper.org/en/stable/Null-substitution.html

В моем случае, при попытке загрузить нулевую сущность с помощью ITyperConverter, NullSubstitue поступает в ForMember точно так же, как это, другими словами, ReverseMap создает экземпляр с нулевыми значениями.

 return mapping.ForMember(property, opt => { 
                opt.NullSubstitute(null);
                opt.MapFrom(mapFrom);
            });