如何在automapper中对具有复杂关系的类进行映射

本文关键字:关系 映射 复杂 automapper | 更新日期: 2023-09-27 18:10:43

public class Item
{
  public string Name { get; set; }
  public virtual ICollection<Stock> Stocks { get; set; }
  public virtual ICollection<Price> Prices { get; set; }
  -- remove some code for brevity --
}
public Stock
{
  public int Id { get; set; }
  public int ItemId { get; set; }
  public int StorageId { get; set; }
  public float Amount { get; set; }
  public virtual Item Item { get; set; }
  public virtual Storage Storage { get; set; }
  -- remove some code for brevity --
}
public class Storage
{
  public string Name { get; set; }
  public virtual ICollection<Stock> Stocks { get; set; }
  -- remove some code for brevity --
}
public class SPrice
{
  public decimal Price { get; set; }
  public int decimal ItemId { get; set; }
  public virtual Item Item { get; set; }
  -- remove some code for brevity --
}

以上是我的POCO类,我刚刚开始使用Automapper。我的关系有点复杂。我对我的source类是什么类以及如何进行映射感到困惑。

因为我想要的只是。

  • 项目名称
  • 商品价格(最近价格)
  • 物品库存(该物品在特定存储中有多少库存,可能是一个集合?)
  • 项目存储(项目所在的位置,可能是一个集合?)

为了清晰,我希望它们像这样显示:

Name   : Snack bar
Price  : $1.00
Stocks :
         Storages    | How many
         Storage1    | 23
         Storage2    | 24
         Storage3    | 10

到目前为止,我只有ItemNameItemPrice是这样的:

Mapper.CreateMap<Item, ItemDTO>()
      .ForMember(dto => dto.Price, opt => 
          opt.MapFrom(s => s.Prices.Any() ? s.Price.OrderByDescending(i => i.Id).FirstOrDefault() : 0m));

然后像这样存储它们:

var items = _itemService.All.Project().To<ItemDTO>();
简而言之,如何对属性成员的其余部分进行映射?任何建议吗?一个演示代码将是伟大的。很多谢谢!

如何在automapper中对具有复杂关系的类进行映射

下面是一个可以添加到我的注释中的例子。

假设你有这些类

模型
public class Item
{
  public string Name { get; set; }
  public virtual ICollection<Stock> Stocks { get; set; }
  public virtual ICollection<Price> Prices { get; set; }
}

视图模型

public class ItemViewModel
{
  public string Name { get; set; }
  public StockViewModel [] Stocks { get; set; }
  public PriceViewModel [] Prices { get; set; }
}

你只需要像这样配置Automapper:

AutoMapper.CreateMap<Item,ItemViewModel>();
AutoMapper.CreateMap<Stock,StockViewModel>();
AutoMapper.CreateMap<Price,PriceViewModel>();

然后AutoMapper将自动确定子组合列表的映射。