2012-06-25 138 views
1

我有以下型号和的ViewModels(编辑为了简洁):Automapper模型>视图模型映射异常

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

这翻倒但如果这些广告的一个返回(在“广告”变量)的一些图像映射。我得到的错误是:

[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映射导致问题?

回答

2

将First First更改为FirstOrDefault并且它应该可以正常工作。

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

Doh !!小学生的错误,谢谢。 – marcusstarnes

相关问题