我有 EF 一个 EF 生成的 Person 类,它具有多个属性。我还有一个具有多个属性的 Jobs 类。一个人与多个工作相关,因此 Jobs 是 person 的 Collection 属性。
我已经创建了一个 View 模型:
public class PersonViewModel
{
public Person Person{ get; set; }
public List<Job> Jobs{ get; set; }
}
在我看来,我正在发布 PersonViewModel 的一个实例。我想使用 AutoMapper 将此 View 模型映射回 Person 的实例,其 Jobs 集合属性填充了 View 模型中的列表。
这能实现吗?到目前为止我已经尝试过:
Mapper.CreateMap<PersonViewModel, Person>();
没有运气......
编辑:
好的,这确实有效。我发现我在其他地方有问题......
我的 Person 对象也与 PersonType 表具有一对多关系...PersonType 成为 Person 的导航属性,自动映射器正在尝试映射此...这是它失败的地方...我成功通过将 Person 与人员类型相关联的 PersonTypeID。我原以为这就是我需要做的全部。我怎样才能解决这个问题...
编辑 2: 所以基本上我在数据库中的 Person 表有一个 PersonTypeID 列(PersonType 表的外键)......这被映射为 Person 的导航属性作为 PersonType 对象......
从我看来的表单中,我有一个下拉列表来选择人员类型,它在 View 模型中将 PersonTypeID 属性传回 Person 对象...
automapper 似乎正在寻找要映射的 Person 的 PersonType nav 属性的值...我得到一个 AutoMapper.AutoMapperMappingException
错误
Destination property: PersonType
Exception of type 'AutoMapper.AutoMapperMappingException' was thrown.
最佳答案
是的,这应该有效。如果 Model 和 ViewModel 共享相同的属性——无论是集合——它们将被 AutoMapper 自动映射,但是:
- 它们需要命名相同
- 如果映射是双向的, map 也需要以两种方式创建,我发现即使是单向的,我也必须以两种方式创建 map
- 如果您有
Job
和JobViewModel
,那么集合的类型不同(但命名方式相同)也只需为它们创建一个映射。
我的直觉是这应该可以解决您的问题:以两种方式创建 map 以查看是否有帮助:
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/
关于c# - 使用 AutoMapper 将复杂的 View 模型映射回具有集合属性的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5573191/