【问题标题】:Using AutoMapper to map complex viewmodel back to model with collection property使用 AutoMapper 将复杂的视图模型映射回具有集合属性的模型
【发布时间】:2014-04-21 20:37:08
【问题描述】:

我有一个 EF 生成的 Person 类,它有几个属性。我还有一个具有多个属性的类 Jobs。一个人与多个工作相关,因此 Jobs 是一个人的 Collection 属性。

我已经创建了这样的视图模型:

public class PersonViewModel
{
    public Person Person{ get; set; }
    public List<Job> Jobs{ get; set; }
}

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

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

 Mapper.CreateMap<PersonViewModel, Person>();

没有运气......

编辑:

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

我的 Person 对象也与 PersonType 表有一对多的关系... PersonType 成为 Person 的导航属性,自动映射器正在尝试映射它...这是失败的地方...我成功通过了将 Person 与人员类型相关联的 PersonTypeID。我以为这就是我需要做的。我该如何解决这个问题...

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

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

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

错误

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

【问题讨论】:

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


    【解决方案1】:

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

    • 它们需要同名
    • 如果映射是双向的,地图也需要创建双向,我发现即使是双向的,我也必须双向创建地图
    • 如果您有 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/

    【讨论】:

    • 你是对的......我发现我的问题出在其他地方。我已经编辑了我原来的问题......你会因为指出我正确的道路而获得支持......我今天没有投票了:)
    • 谢谢斯蒂芬。好的,您能否详细说明您的问题,或者添加一些代码?我很难理解编辑。
    • 好的,添加了一些。希望有帮助
    • 您的视图模型和模型上是否都有人员类型,它们是同一类型吗?
    • PersonType 是 EF 中 Person 的导航属性。它不是视图模型的一部分
    【解决方案2】:

    或者尝试反向映射:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多