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

本文关键字:平面 模型 视图 实体模型 AutoMapper 复杂 使用 | 更新日期: 2023-09-27 18:14:55

我想为一个有点复杂的实体模型创建一个映射到一个扁平视图模型

我的实体模型是这样的

cbItems 
    has many cbItemsContent
            has many cbRegulators

所以我的视图模型是这样的

cbItems

:

public class ItemViewModel
    {
        public ItemViewModel()
        {
            this.CbItemsContents = new HashSet<ItemContentViewModel>();
        }
        public int ItemID { get; set; }
         ...... 
        public virtual ICollection<ItemContentViewModel> CbItemsContents { get; set; }
    }
}
cbItemsContent

:

public class ItemContentViewModel
    {
        public int ItemContentID { get; set; }
        public int ItemID { get; set; }
        ....
        public ItemContentRegulatorsViewModel RegulatedBy { get; set; }
    }
}
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();

但是这会导致错误:

表达式'dest => dest. regulatedby。ItemContentId必须解析为顶层成员,而不是任何子对象的属性。使用自定义使用子类型或AfterMap选项替换。参数名称:lambdaExpression

如何实现我想要的模型布局?

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

你必须映射ItemContentRegulatorsViewModel,然后你不需要从上面的ViewModel设置它

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