EF Core не включает все дочерние элементы - PullRequest
0 голосов
/ 02 февраля 2019

Я использую EF Core и .NET Core 2.0.

У меня есть эта иерархия сущностей:

  • Заказ

    • OrderItem

      • Product

Мой запрос LINQ в сервисе работает, но возвращает только один OrderItem, а у меня 5. Он также хорошо возвращает продукт для этого OrderItem.Поэтому я хочу изменить этот запрос, чтобы он включал фактически все элементы OrderItem, которые у меня есть для определенного идентификатора заказа, а не только первый элемент.Я ожидал, что include сделает эту работу за меня.

public class Order
{
    public int Id { get; set; }
    public DateTime OrderDate { get; set; }
    public decimal TotalPrice { get; set; }
    public List<OrderItem> OrderItems { get; set; }

    public decimal CalculateTotal()
    {
        return OrderItems.Sum(item => item.GetPrice());
    }
}

public class OrderItem
{
    public int Id { get; set; }
    public int OrderId { get; set; }
    public int ProductId { get; set; }
    public int Quantity { get; set; }
    public Product Product { get; set; }
    public Order Order{ get; set; }

    public decimal GetPrice()
    {
        return Product.Price * Quantity;
    }
}

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public decimal Price { get; set; }
}

, и это сервис с запросом:

public class OrderRepository: IOrderRepository
{
    private readonly BasketDbContext _basketDbContext;
    public OrderRepository(BasketDbContext basketDbContext)
    {
        _basketDbContext = basketDbContext;
    }

    public IEnumerable<Order> GetAllOrders()
    {
        return _basketDbContext.Orders
            .Include(x => x.OrderItems)
            .ThenInclude(y => y.Product).ToList();
    }
}

И это JSON, который я получил от метода GetAllOrders:

[  
    {  
      "id":1,
      "orderDate":"2019-02-02T11:24:36.103",
      "totalPrice":0.0000,
      "orderItems":[  
         {  
            "id":1,
            "orderId":1,
            "productId":1,
            "quantity":1,
            "product":{  
               "id":1,
               "name":"Samsung Galaxy S8 64GB",
               "description":"5.8-Inch, Dual pixel 12MP camera",
               "price":390.0000
            }

Как видите, JSON также плохо отформатирован, он не закрывает начальные [{.

Что я делаю неправильно?Спасибо за помощь

1 Ответ

0 голосов
/ 02 февраля 2019

Похоже, что на последнем этапе сериализации ваш сериализатор не может продолжить работу, поэтому просто завершается, и ASP.NET Core отправляет незавершенный ответ клиенту.Возможно, это происходит из-за вашей обратной ссылки от OrderItem до Order.Предполагая, что вы используете Json.NET от Newtonsoft, попробуйте установить JsonSerializerSettings в ReferenceLoopHandling = ReferenceLoopHandling.Ignore в вашем Startup.cs.

public void ConfigureServices(IServiceCollection services)
{
  services.AddMvc()
    .AddJsonOptions(
        o => o.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore
    );
}

Другой вариант - просто исключить Order в OrderItem из сериализации, например, через атрибут [JsonIgnore], однако это, конечно, означает, что он никогда не будет отображаться ни в одном из ваших ответов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...