首页 > 解决方案 > Automapper Parent Child Mapping 将 Grandchildren Properties 设置为 null

问题描述

Automapper 在对象之间映射时似乎忽略了孙对象。所以我只能得到 2 级递归。我至少需要 3 个,最好是 n 个级别。

如何让 Automapper 返回正确的对象,所有子对象都完好无损?

我可以通过序列化我的 DbPOCO 并反序列化到 Dto 来解决它,但这意味着在我的应用程序中交叉关注点,和/或为我不喜欢的这个特定方法做一些不同的事情。

鉴于我的 DB Poco

    public class Menu : SqlTable, IParentChild<Menu>
    {
       public string Label {get; set;}
       public string Route {get; set;}
       public float Sequence { get; set; }
       public int? ParentID {get; set;}
       public Menu Parent {get; set;}
       public IList<Menu> Children { get; set; }
    }

我可以(使用一些递归魔法)返回一个像这样序列化的对象,但它包括(删除的)数据库审计列和其他我不想通过我的 API 进行通信的表通用项。

[
  {
    "Label": "Main Menu 1",
    "Route": "",
    "Sequence": 1,
    "ParentID": null,
    "Parent": null,
    "Children": [
      {
        "Label": "Menu 1 Sub 1",
        "Route": "",
        "Sequence": 1,
        "ParentID": 1,
        "Parent": null,
        "Children": [
          {
            "Label": "Menu 1 Sub 1 Sub 1",
            "Route": "",
            "Sequence": 1,
            "ParentID": 2,
            "Parent": null,
            "Children": [],
            ...
          },
          {
            "Label": "Menu 1 Sub 1 Sub 2",
            "Route": "",
            "Sequence": 2,
            "ParentID": 2,
            "Parent": null,
            "Children": [],
            ...
          }
        ],
        ...
      },
      {
        "Label": "Menu 1 Sub 2",
        "Route": "",
        "Sequence": 2,
        "ParentID": 1,
        "Parent": null,
        "Children": [],
        "ID": 5,
        ...
      }
    ],
    ...
  },
  {
    "Label": "Main Menu 2",
    "Route": "",
    "Sequence": 2,
    "ParentID": null,
    "Parent": null,
    "Children": [
      {
        "Label": "Menu 2 Sub 1",
        "Route": "",
        "Sequence": 1,
        "ParentID": 6,
        "Parent": null,
        "Children": [],
        ...
      }
    ],
    ...
  }
]

当我将其传递给 Automapper 时,将其映射到以下 DTO

public class WebApplicationMenuModel
    {
        public string Label { get; set; }
        public string Route { get; set; }
        public float Sequence { get; set; }
        public IEnumerable<WebApplicationMenuModel> Children { get; set; }

    }

我原始对象的孙子设置为空

[
  {
    "Label": "Main Menu 1",
    "Route": "",
    "Sequence": 1,
    "Children": [
      {
        "Label": "Menu 1 Sub 1",
        "Route": "",
        "Sequence": 1,
        "Children": null
      },
      {
        "Label": "Menu 1 Sub 2",
        "Route": "",
        "Sequence": 2,
        "Children": null
      }
    ]
  },
  {
    "Label": "Main Menu 2",
    "Route": "",
    "Sequence": 2,
    "Children": [
      {
        "Label": "Menu 2 Sub 1",
        "Route": "",
        "Sequence": 1,
        "Children": null
      }
    ]
  }
]

地图配置文件相当基本

    public class MenuProfile : Profile
    {
        public MenuProfile()
        {
            CreateMap<Menu, WebApplicationMenuModel>()
                .ReverseMap();
        }
    }

标签: recursionormautomapperpocodto

解决方案


参见 Lucian Bargaoanu 的回复。需要使用主 Automapper 分支 (9.1.0-ci-01627) 从 MyGet 支持此功能。

https://docs.automapper.org/en/stable/The-MyGet-build.html


推荐阅读