Automapper Parent Child Mapping устанавливает свойства внуков как нулевые - PullRequest
0 голосов
/ 27 марта 2020

Automapper, кажется, игнорирует внуковые объекты при отображении между объектами. Так что я получаю только 2 уровня рекурсии. Мне нужно как минимум 3, в идеале n уровней.

Как заставить Automapper возвращать правильный объект со всеми неповрежденными детьми?

Я могу обойти его, сериализация моего DbPOCO и десериализация в Dto, но это означает пересечение проблем в моем приложении и / или выполнение чего-то другого для этого специфического c метода, который мне не нравится.

Учитывая мою базу данных 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; }
    }

, я могу вернуть (с некоторыми рекурсивными волхвами c) объект, который сериализуется подобным образом, но включает (удаленные) столбцы аудита базы данных и другую таблицу общие c элементы, которые я не хочу передавать через мой 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; }

    }

Внуки из моего оригинального объекта установлено значение null

[
  {
    "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
      }
    ]
  }
]

Профиль карты довольно базовый c

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

1 Ответ

1 голос
/ 27 марта 2020

См. Ответ Люсьена Баргаоану. Требуется пользователь главной ветки Automapper (9.1.0-ci-01627) для поддержки этого от MyGet.

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

...