使用AutoMapper将复杂的视图模型映射回具有集合属性的模型

本文关键字:模型 集合 属性 映射 复杂 AutoMapper 视图 使用 | 更新日期: 2023-09-27 17:49:20

我有一个EF生成的Person类,它有几个属性。我还有一个类Jobs,它有几个属性。一个人与多个作业相关,因此jobs是person的Collection属性。

我已经创建了一个视图模型:

public class PersonViewModel
{
    public Person Person{ get; set; }
    public List<Job> Jobs{ get; set; }
}

从我的观点来看,我发布了一个PersonViewModel的实例。我想使用AutoMapper将这个视图模型映射回Person的实例,其Jobs集合属性填充了来自视图模型的列表。

这能做到吗?到目前为止,我已经尝试了:

 Mapper.CreateMap<PersonViewModel, Person>();

with no luck…

编辑:

好的,这确实有效。我发现我在其他地方有问题……

My Person对象也与PersonType表有一对多关系…PersonType成为Person的导航属性auto mapper试图映射这个…这就是它失败的地方……我成功地传递了一个PersonTypeID来将Person与Person类型关联起来。我以为这就是我所需要做的。如何解决这个问题?

编辑2:所以基本上我的Person表在DB有一个PersonTypeID列(外键到PersonType表)…这被映射为Person的导航属性,作为PersonType对象…

从我视图中的表单中,我有一个下拉列表来选择person Type,它将PersonTypeID属性传递回视图模型中的person Object中…

automapper似乎正在寻找Person的PersonType nav属性的值以映射…我得到一个AutoMapper.AutoMapperMappingException

误差

Destination property: PersonType
Exception of type 'AutoMapper.AutoMapperMappingException' was thrown.

使用AutoMapper将复杂的视图模型映射回具有集合属性的模型

是的,这应该可以工作。如果Model和ViewModel共享相同的属性——无论是一个集合——它们将被AutoMapper 自动映射但是:

  • 它们需要命名为相同的
  • 如果映射是双向的,映射也需要创建双向,和我发现,即使它是单向的,我必须创建映射双向
  • 如果你有JobJobViewModel,所以集合是不同类型的(但命名方式相同),只需为这些创建一个地图。

我的直觉是这应该解决你的问题:创建映射的两种方式,看看它是否有帮助:

Mapper.CreateMap<PersonViewModel, Person>();
Mapper.CreateMap<Person, PersonViewModel>();

<标题>编辑

如果你在ViewModel和Model上有不同类型的属性,AutoMapper将不知道如何转换它们。所以一个选择是忽略它们:

Automapper: Ignore on condition of

或者你可以使用自定义映射:

http://lostechies.com/jimmybogard/2009/05/06/automapper-feature-custom-type-converters/

或者尝试反向映射:

Mapper.CreateMap<Person, PersonViewModel>().ReverseMap();