-1

Hi I am having some issues with Automapper.

I get the following error:

AutoMapper.AutoMapperMappingException: Error mapping types.

Mapping types: List1 -> List1 System.Collections.Generic.List1[[Ordering.Domain.Aggregates.OrderAggregate.Order, Ordering.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] -> System.Collections.Generic.List1[[Ordering.Application.Queries.GetOrders.OrderDto, Ordering.Application, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] ---> AutoMapper.AutoMapperMappingException: Error mapping types.

Mapping types: Order -> OrderDto Ordering.Domain.Aggregates.OrderAggregate.Order -> Ordering.Application.Queries.GetOrders.OrderDto

Type Map configuration: Order -> OrderDto Ordering.Domain.Aggregates.OrderAggregate.Order -> Ordering.Application.Queries.GetOrders.OrderDto

Destination Member: OrderItems

---> System.NullReferenceException: Object reference not set to an instance of an object. at lambda_method248(Closure , Object , List1 , ResolutionContext ) --- End of inner exception stack trace --- at lambda_method248(Closure , Object , List1 , ResolutionContext ) --- End of inner exception stack trace --- at lambda_method248(Closure , Object , List1 , ResolutionContext ) at Ordering.Application.Queries.GetOrders.GetOrdersQueryHandler.Handle(GetOrdersQuery request, CancellationToken cancellationToken) in C:\Users\porterc\Documents\Personal Projects\LostChapters\Services\Ordering\Ordering.Application\Queries\GetOrders\GetOrdersQuery.cs:line 35 at Ordering.Application.Common.Behaviours.TransactionBehaviour2.<>c__DisplayClass4_0.<b__0>d.MoveNext() in C:\Users\porterc\Documents\Personal Projects\LostChapters\Services\Ordering\Ordering.Application\Common\Behaviours\TransactionBehaviour.cs:line 50 --- End of stack trace from previous location --- at Microsoft.EntityFrameworkCore.ExecutionStrategyExtensions.<>c.<b__3_0>d.MoveNext() --- End of stack trace from previous location --- at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.ExecuteAsync[TState,TResult](TState state, Func4 operation, Func4 verifySucceeded, CancellationToken cancellationToken) at Ordering.Application.Common.Behaviours.TransactionBehaviour2.Handle(TRequest request, RequestHandlerDelegate1 next, CancellationToken cancellationToken) in C:\Users\porterc\Documents\Personal Projects\LostChapters\Services\Ordering\Ordering.Application\Common\Behaviours\TransactionBehaviour.cs:line 41

Here is my GetOrdersQueryHandler

public GetOrdersQueryHandler(IOrderRepository orderRepository, IMapper mapper)
{
    _orderRepository = orderRepository;
    _mapper = mapper;
}

public async Task<IEnumerable<OrderDto>> Handle(GetOrdersQuery request, CancellationToken cancellationToken)
{
    var orders = await _orderRepository.GetOrders();
    var orderDtos = _mapper.Map<List<OrderDto>>(orders);

    return orderDtos;
}

Here is GetOrders method:

public async Task<IEnumerable<Order>> GetOrders()
    {
        return await _orderingDbContext.Orders.Include(oi => oi.OrderItems).OrderBy(o => o.OrderPlaced).ToListAsync();
    }

Here is my Order class:

  public class Order : BaseEntity, IAggregateRoot
{
    
    public int OrderTotal { get; private set; }
    public DateTime OrderPlaced { get; private set; }
    public bool OrderPaid { get; private set; }
    public bool IsCancelled { get; private set; }
    public string Message { get; private set; }
    public DeliveryAddress DeliveryAddress { get; private set; }
    public OrderStatusEnum OrderStatus { get; private set; }
    public int? PaymentMethodId { get; private set; }
    public int? CustomerId { get; private set; }

    private readonly List<OrderItem> _orderItems;
    public IReadOnlyCollection<OrderItem> OrderItems => _orderItems;
    protected Order()
    {
        _orderItems = new List<OrderItem>();
        IsCancelled = false;
    }

    public Order(string userId, string userName, DeliveryAddress deliveryAddress, CardTypeEnum cardType, string cardNumber, string cardSecurityNumber,
       string cardHolderName, DateTime cardExpiration, int? customerId = null, int? paymentMethodId = null) : this()
    {
        DeliveryAddress = deliveryAddress;
        OrderStatus = OrderStatusEnum.Pending;
        OrderPlaced = DateTime.UtcNow;
        Message = "New Order Created";
        CustomerId = customerId;
        PaymentMethodId = paymentMethodId;
        AddOrderCreatedDomainEvent(userId, userName, cardType, cardNumber,
                                cardSecurityNumber, cardHolderName, cardExpiration);
    }
      

Here is my OrderDto:

public record OrderDto : IMapFrom<Order>

{

public int Id { get; set; }
public string Street { get; private set; }

public string City { get; private set; }

public string Country { get; private set; }

public string PostCode { get; private set; }
public OrderStatus OrderStatus { get; set; }

private readonly List<OrderBookItemsDto> _orderItems;
public List<OrderBookItemsDto> OrderItems => _orderItems;

public void Mapping(Profile profile)
{
    profile.CreateMap<Order, OrderDto>()
        .ForMember(dto => dto.Street, opt => opt.MapFrom(p => p.DeliveryAddress.Street))
        .ForMember(dto => dto.City, opt => opt.MapFrom(p => p.DeliveryAddress.City))
        .ForMember(dto => dto.Country, opt => opt.MapFrom(p => p.DeliveryAddress.Country))
        .ForMember(dto => dto.PostCode, opt => opt.MapFrom(p => p.DeliveryAddress.PostCode))
        .ForMember(dto => dto.OrderItems, opt => opt.MapFrom(p => p.OrderItems.ToList()));   
}

}

And finally my OrderBookItemsDto:

public record OrderBookItemsDto: IMapFrom<OrderItem>
{
public int BookCatalogueId { get; private set; }
public decimal BookPrice { get; private set; }
public string BookTitle { get; private set; }
public string Message { get; private set; }
public int Quantity { get; private set; }
public void Mapping(Profile profile)
{
    profile.CreateMap<OrderItem, OrderBookItemsDto>(); ;
}

}

Can any one point out where I am going wrong here?

Ports
  • 95
  • 7

1 Answers1

0

I found the answer:

public record OrderDto : IMapFrom<Order>
{
    public OrderDto()
    {
            _orderItems = new List<OrderBookItemsDto>();
    }

I needed to instantiate 0rderItems in my OrderDto. Found the answer here stack overflow link

Ports
  • 95
  • 7