使用AutoMapper将复杂实体模型解析为平面模型视图

时间:2016-10-26 10:51:57

标签: c# .net automapper

我想为一个有点复杂的实体模型创建一个平面视图模型

我的实体模型就是这样

cbItems 
    has many cbItemsContent
            has many cbRegulators

所以我的视图模型就像这样

for cbItems:

public class ItemViewModel
    {
        public ItemViewModel()
        {
            this.CbItemsContents = new HashSet<ItemContentViewModel>();
        }

        public int ItemID { get; set; }
         ...... 
        public virtual ICollection<ItemContentViewModel> CbItemsContents { get; set; }
    }
}

for cbItemsContent:

public class ItemContentViewModel
    {

        public int ItemContentID { get; set; }
        public int ItemID { get; set; }
        ....
        public ItemContentRegulatorsViewModel RegulatedBy { get; set; }

    }
}

for cbRegulators:

public class ItemContentRegulatorsViewModel
    {
        public int ItemContentId { get; set; }
        public IEnumerable<int> RegulatorIds { get; set; }
    }
}

我曾希望它会像这样容易:

config.CreateMap<CbItem, ItemViewModel>();
            config.CreateMap<CbItemsContent, ItemContentViewModel>()
                     .ForMember(dest => dest.RegulatedBy.ItemContentId,
                         m => m.MapFrom(src => src.GenericID))
                     .ForMember(dest => dest.RegulatedBy.RegulatorIds,
                         n => n.MapFrom(src => src.cbItemsContentRegulators.Select(q => q.cbRegulator.RegulatorId)));

来自以下查询:

ItemViewModel item = 
_context.cbItems.Where(u => u.ItemId = id)
.ProjectTo<ItemViewModel>()
.first();

但这会导致错误:

  

Expression&#39; dest =&gt; dest.RegulatedBy.ItemContentId&#39;必须解决   顶级成员,而不是任何子对象的属性。使用自定义   改为对子类型或AfterMap选项进行解析。参数   name:lambdaExpression

我可以实现我想要的模型布局吗?

2 个答案:

答案 0 :(得分:1)

您必须映射ItemContentRegulatorsViewModel,然后您无需从上面的ViewModel设置它。

答案 1 :(得分:0)

@Rabban可能意味着这样的事情:

config.CreateMap<CbItemsContent, ItemContentViewModel>()
      .ForMember(dest => dest.RegulatedBy, o => o.MapFrom(src => src));

config.CreateMap<CbItemsContent, ItemContentRegulatorsViewModel>()
      .ForMember(dest => dest.ItemContentId, o => o.MapFrom(src => src.GenericID))
      .ForMember(dest => dest.RegulatorIds, o => o.MapFrom(src => src.cbItemsContentRegulators.Select(q => q.cbRegulator.RegulatorId)));