Automapper - 如何重用对象而不是创建新对象(此对象在列表中)

Posted

技术标签:

【中文标题】Automapper - 如何重用对象而不是创建新对象(此对象在列表中)【英文标题】:Automapper - How to reuse objects instead of creating new ones (this objects are in a list) 【发布时间】:2011-05-18 12:07:09 【问题描述】:

我遇到了以下问题: 我得到了一个看起来像这样的实体(来自 EF Code First)。

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


public class AudioQuality 
public Guid Idget;set;
public int Channelsget;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 为 AudioQualities 中的每个项目创建一个新的 AudioQuality-Object。

但我希望他只是将 AudioQuality-Objects 中的值从 DTO 复制到实体,而不是使用 DTO 中的值创建新对象。

有没有办法做到这一点?

仅供参考:UseDestinationValue 适用于集合(因此不复制集合)。

br rene_r

【问题讨论】:

【参考方案1】:

从上下文中获取您的实体并将其作为第二个参数传递给 Mapper 函数。更新将从源应用到目标。

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

【讨论】:

这就是我对这行所做的: Movie movieFromDb = GetMoviesWithAllChilds().Single(mov => mov.Id == movieDto.Id); Mapper.Map(movieDto, movieFromDb);

以上是关于Automapper - 如何重用对象而不是创建新对象(此对象在列表中)的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 appWidget 中重用 RemoteViews 而不是每次都创建新的?我该如何存储它们?

effectiveJava避免创建不必要的对象

第5条:避免创建不必要的对象

如何清除 stringio 对象?

如何使用 AutoMapper 使用 EntityFramework 使用嵌套列表更新对象?

如何在global.asax中注册Automapper配置类?