c# - 使用 AutoMapper 将复杂的 View 模型映射回具有集合属性的模型

标签 c# asp.net asp.net-mvc asp.net-mvc-3

我有 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
  • 如果您有 JobJobViewModel,那么集合的类型不同(但命名方式相同)也只需为它们创建一个映射。

我的直觉是这应该可以解决您的问题:以两种方式创建 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/

相关文章:

asp.net-mvc - Azure、数据库和上传文档

c# - 通过反射在复制的列表中设置属性更新原始列表

c# - 一旦 API 可供请求,启动后执行异步代码

c# - 反序列化json时出现异常

c# - 如何处理此类问题 UnauthorizedAccessException Was handli Error?

css - TagHelpers 根据验证属性为 LabelTagHelper 添加自定义类 [必需]

c# - 单个 C# 类中的静态成员初始化顺序

c# - Delphi转c#问题

css - 将网页作为一个整体缩放到任何分辨率

asp.net-mvc - MVC3 验证