具有嵌套目标属性的自动映射器

时间:2016-06-16 18:04:46

标签: c# entity-framework automapper

我正在尝试映射嵌套的子属性,如此。

var mapperConfig = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<Collection, CollectionDTO>()
        .ForMember(dest => dest.Items.Select(x => x.AddedToCollectionDate),
                               opts => opts.MapFrom(src =>
                                   src.CollectionItems.Select(ci => ci.AddedToCollectionDate)));

});

Collection.ItemsList<Item>。每个Item都有一个AddedToCollectionDate属性,我需要从源映射填充。

CollectionDTO具有一个名为CollectionItem的交叉连接表的导航属性,该表具有名为AddedToCollectionDate的属性。

错误:

  

仅对某个类型的顶级个人成员支持成员的自定义配置。

如何使用AutoMapper实现这一目标?

Clases(为简洁省略了其他属性):

public partial class Collection
{   
    public virtual ICollection<CollectionItem> CollectionItems { get; set; }
}

public partial class CollectionItem
{
    public System.DateTime AddedToCollectionDate { get; set; }

    public virtual Collection Collection { get; set; }
    public virtual Item Item { get; set; }
}

public class CollectionDTO
{
    public List<ItemDTO> Items { get; set; }    
    public DateTime LastAccessedDate { get; set; }  
}

public class Item
{
    public DateTime LastAccessedDate { get; set; }
    public virtual ICollection<CollectionItem> CollectionItems { get; set; }
}

2 个答案:

答案 0 :(得分:1)

我通过FirstOrDefault()代替Select()这样的选择来实现它。

cfg.CreateMap<Item, ItemDTO>()
                    .ForMember(dest => dest.AddedToCollectionDate,
                               opts => opts.MapFrom(src =>
                                   src.CollectionItems.FirstOrDefault().AddedToCollectionDate));

答案 1 :(得分:0)

您应该为ForMember配置映射,而不是CollectionItem调用。

cfg.CreateMap<CollectionItem, ItemDTO>();
cfg.CreateMap<Collection, CollectionDTO>();

如果您还将CollectionDTO.Items重命名为CollectionDTO.CollectionItems,AutoMapper知道足以将Collection.CollectionItems映射到CollectionDTO中的正确集合。