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,并配置从PositionPositionDTO 的映射以忽略Item 属性。否则,您仍然在 DTO 中携带对原始数据对象的引用,这违背了 DTO 的目的。

【讨论】:

以上是关于Automapper 总是显示子实体的主要内容,如果未能解决你的问题,请参考以下文章

3AutoMapper In Asp.net Core

使用 AutoMapper 自动在多个数据模型间进行转换

如何使用 AutoMapper 将父引用分配给子属性

使用 automapper 更新实体框架实体

AutoMapper C#实体映射

将 AutoMapper 与实体框架一起使用时出现异常