使用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
如何实现我想要的模型布局?
你必须映射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)));