Automapper — Как повторно использовать объекты вместо создания новых (эти объекты находятся в списке)

#automapper #entity-framework-4.1

#автоматический преобразователь #сущность-фреймворк-4.1 #automapper #entity-framework-4.1

Вопрос:

У меня возникла следующая проблема: я получил объект (сначала из кода EF), который выглядит следующим образом.

  public class Movie {
 public ICollection<AudioQuality> AudioQualities  {get;set;}
}

public class AudioQuality {
public Guid Id{get;set;}
public int Channels{get;set;}
}

//Automapper Init:
Mapper.CreateMap<Movie, MovieDto>();
        Mapper.CreateMap<MovieDto, Movie>().ForMember(dest => dest.AudioQualities,opt => opt.UseDestinationValue());


        Mapper.CreateMap<VideoQuality, VideoQualityDto>();
        Mapper.CreateMap<AudioQuality, AudioQaulityDto>();

        Mapper.CreateMap<VideoQualityDto, VideoQuality>();
        Mapper.CreateMap<AudioQaulityDto, AudioQuality>()
            .ForMember(dest => dest.Movies, opt => opt.Ignore());
  

И я также получил DTO, который выглядит аналогично!

Я сопоставляю DTO с объектом следующим образом:

 //Get Movie from DB and than update it with the dto values
Movie movieFromDb = GetMoviesWithAllChilds().Single(mov => mov.Id == movieDto.Id);

//use update the entity from db with dto
Mapper.Map(movieDto, movieFromDb);
  

Теперь проблема в том, что Automapper создает новый AudioQuality-объект для каждого элемента в AudioQualities.

Но я хочу, чтобы он просто копировал значения из объектов AudioQuality из DTO в Сущности вместо того, чтобы создавать новые объекты со значениями из DTO.

Есть ли способ сделать это??

К вашему СВЕДЕНИЮ: UseDestinationValue работает с коллекцией (поэтому коллекция не копируется).

br рене_р

Ответ №1:

Извлеките вашу сущность из контекста и передайте ее в функцию Mapper в качестве второго параметра. Обновления будут применены от источника к месту назначения.

 mapper.Map<SourceType, DestType>(source, dest);
  

Комментарии:

1. Вот что я сделал с этими строками: Movie movieFromDb = GetMoviesWithAllChilds().Single(mov => mov. Id == movieDto. Идентификатор); Mapper.Map(movieDto, movieFromDb);