我有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.
答案 0 :(得分:8)
是的,这应该有效。如果Model和ViewModel共享相同的属性 - 无论是集合 - 它们将由AutoMapper 自动映射,但是:
Job
和JobViewModel
所以集合的类型不同(但命名方式相同),也可以为这些集合创建一个地图。我的预感是这应该可以解决您的问题:创建地图两种方式,看看它是否有帮助:
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();