内部有集合的地图模型



我有一个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);
}

它运行良好。按预期返回包含ShoppingCartItems的ShoppingCAR。

但是,我不想退回购物车,而是退回购物车资源。类似的东西:

[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。

由于源对象中对应的属性没有相同的名称ShoppingCartItems,因此它无法自动工作,因此您缺少一行来告诉AutoMapper应该从哪里映射ShoppingCartItemResources。只需添加以下内容:

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>();

最新更新