使用AutoMapper将子对象映射到基础对象

时间:2017-07-03 14:08:59

标签: c# automapper

我有两个模型 DashboardWidgetModel WidgetModel 我想映射到单个视图模型 WidgetViewModel

关联仪表板小组件模型

        public DashboardWidgetModel()
        {
            public int Id {get;set;}
            public int DashboardId {get;set;}
            public int WidgetId {get;set;}
            public virtual Widget Widget {get;set;}
            public int PositionX{get;set;}
            public int PositionY {get;set;}
        }

小部件模型

        public WidgetModel()
        {
            public int Id {get;set;}
            public string Name {get;set;}
            public string Desc {get;set;}
            public int P3{get;set;}
            public int P4 {get;set;}
            public int P5 {get;set;}
        }

窗口小部件视图模型

        public WidgetViewModel()
        {
            public int Id {get;set;}
            public string PositionX {get;set;}
            public string PositionY {get;set;}
            public string Name {get;set;}
            public string Desc {get;set;}
            public int P3 {get;set;}
            public int P4 {get;set;}
            public int P5 {get;set;}

        }

我正在使用AutoMapper来处理我应用程序其余部分的映射,并希望将所有属性映射到单个平面视图模型。问题是Widgets是一个嵌套对象。

不是手动定义要从子对象映射的每个项目,而是有办法自动执行此操作吗?

    public DashboardProfile()
    {
        CreateMap<DashboardToWidget, WidgetViewModel>()
            .ForMember(vm => vm.Name, opt => opt.MapFrom(m => m.Widget.Name))
            .ForMember(vm => vm.Desc, opt => opt.MapFrom(m => m.Widget.Desc))
            .ForMember(vm => vm.P3, opt => opt.MapFrom(m => m.Widget.P3))
            .ForMember(vm => vm.P4, opt => opt.MapFrom(m => m.Widget.P4))
            .ForMember(vm => vm.P5, opt => opt.MapFrom(m => m.Widget.P5)); 

        CreateMap<Widget, WidgetViewModel>();
    }

感觉好像我需要将DashboardWidgetModel映射到WidgetViewModel,然后将WidgetModel映射到同一WidgetViewModel之后,但我不确定如何执行此操作或用于找到答案的术语。

编辑(在CSL回答之后):由于继承,我无法更改属性名称。

1 个答案:

答案 0 :(得分:1)

如果您将目标属性名称更改为以Widget为前缀,则无需任何自定义映射,AutoMapper将自动计算出您要引用Widget类的子属性:

public WidgetViewModel()
{
    public int Id {get;set;}
    public string PositionX {get;set;}
    public string PositionY {get;set;}
    public string WidgetName {get;set;}
    public string WidgetDesc {get;set;}
    public int WidgetP3 {get;set;}
    public int WidgetP4 {get;set;}
    public int WidgetP5 {get;set;}
}

映射将简单地变为:

public DashboardProfile()
{
    CreateMap<DashboardWidgetModel, WidgetViewModel>();
}