未使用自动映射器从数据库接收所有数据

问题描述 投票:0回答:1

在我的宠物项目中将响应从 DB 映射到 Dto 模型时遇到一些问题:

  • 测绘前:

  • 映射后:

这里有一些代码(很抱歉,如果它是多余的,但只是想澄清问题):

public class Order 
{
  // properties...
  public List<OrderItem> OrderItems { get; set; } = new();
}

public class OrderItem
{
  public decimal Price { get; set; }
  public int Quantity { get; set; }
  public ProductItemOrdered ItemOrdered { get; set; }
}

public class ProductItemOrdered 
{
  public int ProductItemId { get; set; }
  public string ProductName { get; set; }
  public string ImageUrl { get; set; }
}
public class GetOrderByIdHandler : IRequestHandler<GetOrderByIdRequest, GetOrderByIdResponse>
{
   // constructor + properties...

  public async Task<GetOrderByIdResponse> Handle(GetOrderByIdRequest request, CancellationToken cancellationToken)
  {
    var query = new GetOrderQuery()
    {
      Id = request.OrderId
    };
    var order = await this.queryExecutor.Execute(query);
    if (order is null)
    {
      return new GetOrderByIdResponse()
      {
        Error = new ErrorModel(ErrorType.NotFound)
      };
    }

    var mappedOrder = this.mapper.Map<Domain.Models.OrderToReturnDto>(order);
    var response = new GetOrderByIdResponse()
    {
      Data = mappedOrder
    };

    return response;
  }
}

public class GetOrderByIdRequest : IRequest<GetOrderByIdResponse>
{
 public int OrderId;
}

public class GetOrderQuery : QueryBase<Order>
{
  public int Id { get; init; }

  public override async Task<Order> Execute(StorageContext context) 
    => await context.Orders
      .Include(x => x.OrderItems)
      .FirstOrDefaultAsync(x => x.Id == this.Id);
}
public class OrderToReturnDto
{
  // properties...
  public List<OrderItemDto> OrderItems { get; set; } = new();
}

public class OrderItemDto
{
  public int ProductId { get; init; }
  public decimal Price { get; init; }
  public string ProductName { get; init; }
  public string ImageUrl { get; init; }
  public int Quantity { get; init; }
}
public class OrdersProfile : Profile
{
  CreateMap<Order, OrderToReturnDto>()
    .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))
    // other property mappings
    .ForMember(dest => dest.OrderItems, opt => opt.MapFrom(src => src.OrderItems));
}

public class OrderItemsProfile : Profile
{
  public OrderItemsProfile()
  {
    CreateMap<OrderItem, OrderItemDto>()
      .ForMember(dest => dest.Price, opt => opt.MapFrom(src => src.Price))
      .ForMember(dest => dest.Quantity, opt => opt.MapFrom(src => src.Quantity))
      .ForMember(dest => dest.ProductId, opt => opt.MapFrom(src => src.ItemOrdered.ProductItemId))
      .ForMember(dest => dest.ProductName, opt => opt.MapFrom(src => src.ItemOrdered.ProductName))
      .ForMember(dest => dest.ImageUrl, opt => opt.MapFrom(src => src.ItemOrdered.ImageUrl));
  }
}

我听到很多意见认为 Automapper 很糟糕并且很难调试。 但我在这个项目中的任何地方都使用 Automapper,并希望继续下去。

预先感谢您的任何建议!

如果我的问题可能会让有人失望,我还不是开发人员:)

asp.net-core asp.net-web-api automapper cqrs
1个回答
0
投票

从数据库加载数据时,您可能需要再添加一条

ThenInclude
语句。更新以下代码

public override async Task<Order> Execute(StorageContext context)
    => await context.Orders
    .Include(x => x.OrderItems)
    .FirstOrDefaultAsync(x => x.Id == this.Id);

public override async Task<Order> Execute(StorageContext context)
    => await context.Orders
    .Include(x => x.OrderItems)
    .ThenInclude(o => o.ItemOrdered)
    .FirstOrDefaultAsync(x => x.Id == this.Id);
© www.soinside.com 2019 - 2024. All rights reserved.