内置集合的地图模型

Map Model with Collection Inside

我有一个像这样的 API 端点:

        [HttpGet("{shoppingCartId}")]
        public async Task<IActionResult> GetShoppingCart(int shoppingCartId)
        {
            var shoppingCart = await context.ShoppingCarts.Include(c => c.ShoppingCartItems).SingleOrDefaultAsync(c => c.Id == shoppingCartId);

            if (shoppingCart == null)
                return NotFound("There is no shoppingCart for specified query.");

            return Ok(shoppingCart);
        }

它工作正常。 Returns 一个带有 ShoppingCartItems 的 ShoppingCart。

但是,我不想 return shoppingCart 而是 shoppingCartResource。 类似的东西:

        [HttpGet("{shoppingCartId}")]
        public async Task<IActionResult> GetShoppingCart(int shoppingCartId)
        {
            var shoppingCart = await context.ShoppingCarts.Include(c => c.ShoppingCartItems).SingleOrDefaultAsync(c => c.Id == shoppingCartId);

        if (shoppingCart == null)
            return NotFound("There is no shoppingCart for specified query.");

        var shoppingCartResource = mapper.Map<ShoppingCart, ShoppingCartResource>(shoppingCart);
        return Ok(shoppingCartResource);
    }

如您所见,ShoppingCart 模型内部有一个 ShoppingCartItem 集合。

    public class ShoppingCart
    {
        public int Id { get; set; }
        public DateTime DateCreated { get; set; }
        public ICollection<ShoppingCartItem> ShoppingCartItems { get; set; }

        public ShoppingCart()
        {
            ShoppingCartItems = new Collection<ShoppingCartItem>();
        }
    }

这里是 ShoppingCartResource 模型

  public class ShoppingCartResource
    {
        public int Id { get; set; }
        public DateTime DateCreated { get; set; }
        public ICollection<ShoppingCartItemResource> ShoppingCartItemResources { get; set; }

        public ShoppingCartResource()
        {
            ShoppingCartItemResources = new Collection<ShoppingCartItemResource>();
        }
    }

映射代码为:

 CreateMap<ShoppingCart, ShoppingCartResource>();
 CreateMap<ShoppingCartItem, ShoppingCartItemResource>();

没有错误,但我得到了唯一一个 ShoppingCartItemResource 为空的 shoppingCartResource。

您缺少单行告诉 AutoMapper 应该从哪里映射 ShoppingCartItemResources 因为源对象中相应的 属性 没有相同的名称 - ShoppingCartItems,因此它不会自动工作。只需添加:

CreateMap<ShoppingCart, ShoppingCartResource>()
    .ForMember(
        dst => dst.ShoppingCartItemResources, 
        opts => opts.MapFrom(src => src.ShoppingCartItems));
CreateMap<ShoppingCartItem, ShoppingCartItemResource>();

默认情况下,AutoMapper 遵循命名约定,如果名称匹配,则自动在源 属性 和目标 属性 之间创建映射,您无需为此配置任何内容. 但是,如果您想要两个属性之间的映射并且它们的名称不匹配,那么您必须为该映射显式定义配置。

您的 ShoppingCartResourceShoppingCart 对象都有名为 IdDateCreated 的属性,因此它们会自动映射。

获取您的 ICollection 属性之间的映射 -

  1. 如果你想要一个自动地图,你必须给他们一个匹配的名字
  2. 如果你想在命名上保持区别,你必须显式定义它们映射的配置。像 -
CreateMap<ShoppingCart, ShoppingCartResource>()
    .ForMember(d => d.ShoppingCartItemResources, opt => opt.MapFrom(s => s.ShoppingCartItems));

CreateMap<ShoppingCartItem, ShoppingCartItemResource>();