内置集合的地图模型
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 遵循命名约定,如果名称匹配,则自动在源 属性 和目标 属性 之间创建映射,您无需为此配置任何内容.
但是,如果您想要两个属性之间的映射并且它们的名称不匹配,那么您必须为该映射显式定义配置。
您的 ShoppingCartResource
和 ShoppingCart
对象都有名为 Id
和 DateCreated
的属性,因此它们会自动映射。
获取您的 ICollection
属性之间的映射 -
- 如果你想要一个自动地图,你必须给他们一个匹配的名字
- 如果你想在命名上保持区别,你必须显式定义它们映射的配置。像 -
CreateMap<ShoppingCart, ShoppingCartResource>()
.ForMember(d => d.ShoppingCartItemResources, opt => opt.MapFrom(s => s.ShoppingCartItems));
CreateMap<ShoppingCartItem, ShoppingCartItemResource>();
我有一个像这样的 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 遵循命名约定,如果名称匹配,则自动在源 属性 和目标 属性 之间创建映射,您无需为此配置任何内容. 但是,如果您想要两个属性之间的映射并且它们的名称不匹配,那么您必须为该映射显式定义配置。
您的 ShoppingCartResource
和 ShoppingCart
对象都有名为 Id
和 DateCreated
的属性,因此它们会自动映射。
获取您的 ICollection
属性之间的映射 -
- 如果你想要一个自动地图,你必须给他们一个匹配的名字
- 如果你想在命名上保持区别,你必须显式定义它们映射的配置。像 -
CreateMap<ShoppingCart, ShoppingCartResource>()
.ForMember(d => d.ShoppingCartItemResources, opt => opt.MapFrom(s => s.ShoppingCartItems));
CreateMap<ShoppingCartItem, ShoppingCartItemResource>();