Hi I am having some issues with Automapper.
I get the following error:
AutoMapper.AutoMapperMappingException: Error mapping types.
Mapping types:
List1 -> List
1
System.Collections.Generic.List1[[Ordering.Domain.Aggregates.OrderAggregate.Order, Ordering.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] -> System.Collections.Generic.List
1[[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 , List
1 , 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.TransactionBehaviour
2.<>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, Func
4 verifySucceeded, CancellationToken cancellationToken)
at Ordering.Application.Common.Behaviours.TransactionBehaviour2.Handle(TRequest request, RequestHandlerDelegate
1 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?