使用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.
是的,这应该可以工作。如果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/标题>或者尝试反向映射:
Mapper.CreateMap<Person, PersonViewModel>().ReverseMap();