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

ste*_*776 5 c# asp.net asp.net-mvc asp.net-mvc-3

我有EF一个EF生成的Person类,它有几个属性.我还有一个有几个属性的职位.一个人与多个工作有关,因此工作是人的收集财产.

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

public class PersonViewModel
{
    public Person Person{ get; set; }
    public List<Job> Jobs{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

从我的角度来看,我发布了PersonViewModel的一个实例.我想使用AutoMapper将此viewmodel映射回Person的实例,其Jobs集合属性填充了视图模型中的列表.

这可以实现吗?到目前为止,我尝试过:

 Mapper.CreateMap<PersonViewModel, Person>();
Run Code Online (Sandbox Code Playgroud)

没有运气......

编辑:

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

我的Person对象也与PersonType表有一对多的关系... PersonType成为Person的导航属性,自动映射器试图映射这个......这是它失败的地方......我成功地将PersonTypeID传递给将人员与人员类型相关联.我原以为这就是我需要做的一切.我怎样才能解决这个问题......

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

从我的视图中的表单,我有一个下拉列表来选择人类类型,它在视图模型中的Person对象中传递PersonTypeID属性...

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

错误

Destination property: PersonType
Exception of type 'AutoMapper.AutoMapperMappingException' was thrown.
Run Code Online (Sandbox Code Playgroud)

Ali*_*tad 8

是的,这应该有效.如果Model和ViewModel共享相同的属性 - 无论是集合 - 它们将由AutoMapper 自动映射,但是:

  • 他们需要命名相同
  • 如果映射是双向的,那么地图也需要以两种方式创建,我发现即使它是单向的,我也必须创建mapboth方式
  • 如果你JobJobViewModel这样的集合是不同类型的(但指定的方法相同)的只需要创建一个映射为这些孩子的.

我的预感是这应该解决你的问题:创建地图两种方式来看看它是否有帮助:

Mapper.CreateMap<PersonViewModel, Person>();
Mapper.CreateMap<Person, PersonViewModel>();
Run Code Online (Sandbox Code Playgroud)

编辑

如果ViewModel和Model上有属性,并且它们的类型不同,则AutoMapper将不知道如何转换它们.所以一种选择就是忽略它们:

Automapper:忽略条件

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

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