Automapper - 嵌套为子项时忽略属性

Automapper - ignore properties when nested as a child

我定义了两个简单的 DTO,我将传递给 automapper v10.0.0

class RequestDTO {
   public int Id { get; set; }
   // other properties
   public IEnumerable<AssetDTO> Assets { get; set; }
}

class AssetDTO {
   public int RequestId { get; set; }
   // other properties
}

当我映射资产时,它应该显示 RequestId。那工作正常。但是,当我映射 RequestDTO 时,没有理由让每个资产都包含 RequestId,因为 Id 已经通过 RequestDTO.

包含了

有没有一种简单的方法可以在 RequestId 由于父请求被映射而被映射时忽略它?

所以如果我只是映射资产,我想要

{
  "RequestId": 12,
  "OtherProperty": ""
}

但是如果我正在映射一个请求,我想要:

{
  "Id": 12,
  "Assets": [
    {
      "OtherProperty", ""
    }
  ]
}

这与映射无关,而是与数据对象的形状有关。 AssetDTO 是一个 class,它 RequestId 属性 定义。因此,您不能只期望创建一个 AssetDTO 对象而 没有 RequestId 属性 在其中。

即使您试图在映射过程中忽略它,您最终也会得到 RequestId 的值为 0(int 类型的默认值)。

DTO 的主要目的是根据需要创建不同形状的数据对象,创建大量 DTO 以从单一模型类型进行映射是相当普遍的。因此,您的问题的解决方案是使用两个不同的 DTO 在两种不同的情况下映射 Asset 类型 -

class ChildAssetDTO
{
    // other properties    // no RequestId in this class
}

class AssetDTO : ChildAssetDTO
{
    public int RequestId { get; set; }    // only the RequestId in this class
}

class RequestDTO
{
   public int Id { get; set; }
   // other properties
   public IEnumerable<ChildAssetDTO> Assets { get; set; }
}

现在您可以使用 AssetDTO 映射 Asset 类型,使用 AssetChildDTO 映射 Request 类型。