EF Core 不包含所有子项

EF Core does not include all the child items

我正在使用 EF Core 和 .NET Core 2.0。

我有这个实体层次结构:

我在服务中的 LINQ 查询有效,但只有 returns 个 OrderItem 而我有 5 个。它也是 returns 该 OrderItem 的产品。 所以我想要的是,修改此查询以实际上包括我拥有的特定订单 ID 的所有 OrderItems,而不仅仅是第一个项目。我期待 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();
    }
}

这是我从 GetAllOrders:

方法中得到的 JSON
[  
    {  
      "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 的格式也不正确,它没有关闭初始的 [{.

我做错了什么? 感谢帮助

这看起来像是在序列化的最后一步,您的序列化程序无法继续,因此只是退出,ASP.NET核心将未完成的响应发送给客户端。发生这种情况可能是因为您从 OrderItemOrder 的反向引用。假设您使用的是 Newtonsoft 的 Json.NET,请尝试在 Startup.cs.

中将 JsonSerializerSettings 设置为 ReferenceLoopHandling = ReferenceLoopHandling.Ignore
public void ConfigureServices(IServiceCollection services)
{
  services.AddMvc()
    .AddJsonOptions(
        o => o.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore
    );
}

另一种选择是简单地将 OrderItem 中的 Order 从序列化中排除,例如但是,通过 [JsonIgnore] 属性,这当然意味着它永远不会出现在您的任何回复中。