Automapper父子映射将"孙子属性"设置为null



在对象之间进行映射时,Automapper似乎忽略了孙对象。所以我只得到两个递归级别。我至少需要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();
}
}

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

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

最新更新