Automapper 总是显示子实体
Posted
技术标签:
【中文标题】Automapper 总是显示子实体【英文标题】:Automapper always showing children entities 【发布时间】:2022-01-01 14:04:38 【问题描述】:我有一个父类:Item. 还有一个相关的子类:Position。
我不想将 Item 作为 Position 类的子级。 但是当我使用 automapper 时,Item 总是作为 Position 的子项包含在内。
类:
// Item
public int Id get; set;
public string Name get; set;
public ICollection<Position> Positions get; set;
// Position
public int Id get; set;
public int ItemId get; set;
public int CoordinateX get; set;
public int CoordinateY get; set;
public Item Item get; set;
// Item DTO
public int Id get; set;
public string Name get; set;
public ICollection<Position> Positions get; set;
// Mapping profile
CreateMap<Item, ItemDTO>();
我得到一个像这样的项目:
Item item = dbContext.Items.AsNoTracking().Include(p => p.Positions);
它正确返回结果。这是我希望看到的。比如:
Id: 1
Name: "ABC",
Positions:
[
Id: 1,
ItemId: 1,
CoordinateX: 10,
CoordinateY: 15,
Item: []
,
Id: 2,
ItemId: 1,
CoordinateX: 13,
CoordinateY: 18,
Item: []
]
请注意,子记录中的 Item 对象为空。 但是,如果我使用自动映射器,则 Item 总是作为 Position 的子项包含在内。
var result = mapper.Map<ItemDTO>(item);
它产生以下结果:
Id: 1
Name: "ABC",
Positions:
[
Id: 1,
ItemId: 1,
CoordinateX: 10,
CoordinateY: 15,
Item:
[
Id: 1,
Name: "ABC",
Positions: []
]
,
Id: 2,
ItemId: 1,
CoordinateX: 13,
CoordinateY: 18,
Item:
[
Id: 1,
Name: "ABC",
Positions: []
]
]
如何使用 automapper 仍能达到预期效果? 我正在使用 .NET 5 和 automapper 8.1.1 我尝试在映射配置文件中使用 .Ignore 属性,但结果是一样的。
【问题讨论】:
【参考方案1】:您不是在“映射”Position
列表,而是在复制引用。
我也会创建一个PositionDTO
,并配置从Position
到PositionDTO
的映射以忽略Item
属性。否则,您仍然在 DTO 中携带对原始数据对象的引用,这违背了 DTO 的目的。
【讨论】:
以上是关于Automapper 总是显示子实体的主要内容,如果未能解决你的问题,请参考以下文章