我遇到的问题是,在设置 Automapper.Extensions.OData 后,我的 getbyid 为所有值返回 null。我的 GetOrdersAsync 工作正常(扩展和非扩展调用,我需要的所有内容都会返回)
存储库:
public async Task<IEnumerable<OrderDto>> GetOrdersAsync(ODataQueryOptions<OrderDto> options)
{
return await _context.Orders.GetQueryAsync(_mapper, options);
}
public async Task<OrderDto?> GetOrderByIdMapperAsync(int id)
{
return await _context.Orders
.Where(x => x.Id == id)
.ProjectTo<OrderDto>(_mapper.ConfigurationProvider)
.SingleOrDefaultAsync();
}
自动映射器
CreateMap<Order, OrderDto>().ForAllMembers(opt => opt.ExplicitExpansion());
控制器
[HttpGet]
public async Task<ActionResult<IEnumerable<OrderDto>>> Get(ODataQueryOptions<OrderDto> options)
{
var orders = await _orderRepository.GetOrdersAsync(options);
return Ok(orders);
}
[EnableQuery]
public async Task<ActionResult<OrderDto?>> Get([FromODataUri] int key)
{
return await _orderRepository.GetOrderByIdMapperAsync(key);
}
DTO
public class OrderDto
{
public int Id { get; set; }
public string? Name { get; set; }
public string? Description { get; set; }
public string? CategoryName { get; set; } // this is a separate entity (navigation)
public OrderStatusDto? OrderStatus { get; set; }
}
我还没有更新 GetOrderByIdMapperAsync 的存储库,每当我尝试执行类似 GetQueryAsync 的操作时,它都会返回语法错误,即使在查看文档后也不确定如何执行它。我也可以将选项传递给它吗? (我尝试过,但再次不确定它如何与 SingleOrDefaultAsync 结合)
如果“Order”和“OrderDto”类中的属性相同,则映射应该没有问题。我建议的另一种选择是使用 ReverseMap 方法。 你的代码看起来像这样:
自动映射器
CreateMap<Order, OrderDto>().ReverseMap();
有了这个,您可以毫无问题地在两个方向上绘制地图。