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

时间:2011-04-06 21:29:12

标签: 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; }
}

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

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

 Mapper.CreateMap<PersonViewModel, Person>();

没有运气......

编辑:

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

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

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

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

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

错误

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

2 个答案:

答案 0 :(得分:8)

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

  • 他们需要命名相同
  • 如果映射是双向的,那么地图也需要以两种方式创建,并且我发现即使它是单向的,我也必须创建mapboth方式
  • 如果你有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/

答案 1 :(得分:0)

或尝试反向映射:

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