#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);
});