【问题标题】:C# automapper nested collectionsC# automapper 嵌套集合
【发布时间】:2009-11-24 13:00:26
【问题描述】:

我有一个像这样的简单模型:

public class Order{
   public int Id { get; set; }
   ... ...
   public IList<OrderLine> OrderLines { get; set; }
}

public class OrderLine{
   public int Id { get; set; }
   public Order ParentOrder { get; set; }
   ... ...
}

我用 Automapper 做的是这样的:

    Mapper.CreateMap<Order, OrderDto>();
    Mapper.CreateMap<OrderLine, OrderLineDto>();
    Mapper.AssertConfigurationIsValid();

它抛出一个异常,上面写着: “OrderDto中的属性OrderLineDtos未映射,添加自定义映射...” 由于我们在 Domain 和 DomainDto 中使用自定义语法,我如何指定 OrderDto 中的 OrderLineDtos 集合对应于 Order 中的 OrderLines?

谢谢

【问题讨论】:

  • 您是否尝试过将 OrderLine CreateMap 放在 Order 映射之前?
  • 你能发布你的 Dto 的样子吗?以及您使用的自定义语法的示例?我们需要它来为您提供自定义映射的示例。
  • 如果我交换订单,我会收到不同的错误... OrderLineDto 中的 OrderDto 未映射... 你知道如何使用自定义映射表达式吗?

标签: c# automapper


【解决方案1】:

它是这样工作的:

    Mapper.CreateMap<Order, OrderDto>()
        .ForMember(dest => dest.OrderLineDtos, opt => opt.MapFrom(src => src.OrderLines));
    Mapper.CreateMap<OrderLine, OrderLineDto>()
        .ForMember(dest => dest.ParentOrderDto, opt => opt.MapFrom(src => src.ParentOrder));
    Mapper.AssertConfigurationIsValid();

【讨论】:

  • 您是否知道无论您的声誉如何,您都可以编辑您的原始帖子?保留原始问题中的任何信息更新总是好的。
【解决方案2】:

只要名称匹配,嵌套集合就可以工作。在您的 DTO 中,您的集合名称为“OrderLineDtos”,但在 Order 对象中,它只是“OrderLines”。如果删除 OrderLineDtos 和 ParentOrderDto 属性名称的“Dtos”部分,它们应该都匹配。

【讨论】:

  • 那么,这是否意味着映射不同类类型的嵌套集合目前不起作用?有时嵌套对象是 ViewModel 并且具有需要以不同方式映射的属性。谢谢!
  • 它会使用与 Tdestination 中定义的相同的具体 ICollection/IList 类型吗?
  • @Jimmy Bogard:很多时候嵌套对象本身就是一个 DTO 或 ViewModel。
猜你喜欢
  • 2020-04-15
  • 2020-12-12
  • 1970-01-01
  • 2016-01-07
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多