Automapper Model > ViewModel Mapping Exception

У меня есть следующие модели и ViewModels (отредактировано для краткости):

public class Advert
{
    public virtual long Id { get; set; }
    public virtual string Title { get; set; }
    public virtual string Descrip { get; set; }
    public virtual IList<AdvertImage> AdvertImages { get; set; }
}

public class AdvertImage
{
    public virtual byte DisplayOrder { get; set; }
    public virtual string Filename { get; set; }
    public virtual string UrlDirectoryRoot { get; set; }
    public virtual long FilesizeBytes { get; set; }

    public virtual Advert Advert { get; set; }
}

public class AdvertImageViewModel
{
    public virtual string Filename { get; set; }
    public virtual byte DisplayOrder { get; set; }
}

public class ListAdvertViewModel
{
    public long Id { get; set; }
    public virtual string Title { get; set; }
    public virtual string Descrip { get; set; }
    public AdvertImageViewModel AdvertImage { get; set; }
}

У меня есть следующие сопоставления AutoMapper:

Mapper.CreateMap<AdvertImage, AdvertImageViewModel>();

Mapper.CreateMap<Advert, ListAdvertViewModel>()
                .ForMember(d => d.AdvertImage, o => o.MapFrom(s => (s.AdvertImages == null ? null : s.AdvertImages.First())));

Затем один из методов моего контроллера выполняет следующие действия, чтобы получить список рекламных объявлений (из которых каждая реклама может иметь любое количество AdvertImages):

var ads = _advertService.GetAdverts();

Затем я пытаюсь отобразить эти объявления в моем ListAdvertViewModel Класс ViewModel

var mappedAds = Mapper.Map<IList<Advert>, IList<ListAdvertViewModel>>(ads);

Это происходит, хотя, если одна из возвращенных рекламных объявлений (в переменной 'ads') имеет несколько изображений для сопоставления. Я получаю ошибку:

[InvalidOperationException: Sequence contains no elements]
   System.Linq.Enumerable.First(IEnumerable`1 source) +498
   AutoMapper.DelegateBasedResolver`2.Resolve(ResolutionResult source) +153
   System.Linq.Enumerable.Aggregate(IEnumerable`1 source, TAccumulate seed, Func`3 func) +160
   AutoMapper.Mappers.PropertyMapMappingStrategy.MapPropertyValue(ResolutionContext context, IMappingEngineRunner mapper, Object mappedObject, PropertyMap propertyMap) +250

[AutoMapperMappingException: 

Mapping types:
Advert -> AdvertImageViewModel
MyProject.Models.Advert -> MyProject.ViewModels.AdvertImageViewModel

Destination path:
IList`1[1].AdvertImage

Я не могу понять, почему это сопоставление AdvertImage вызывает проблемы?

1 ответ

Решение

Измените First на FirstOrDefault, и он должен работать.

Mapper.CreateMap<Advert, ListAdvertViewModel>()
            .ForMember(d => d.AdvertImage, o => o.MapFrom(s => (s.AdvertImages == null ? null : s.AdvertImages.FirstOrDefault())));
Другие вопросы по тегам