EF Core不包括所有的子项

时间:2019-02-02 11:12:47

标签: c# linq .net-core asp.net-core-webapi ef-core-2.0

我使用EF核心和.NET核2.0。

我有这样的实体层次结构:

  • 订购

    • OrderItem

      • 产品

我在服务中的LINQ查询有效,但是只返回一个OrderItem,而我有5个。它也很好地返回了该OrderItem的产品。 所以我想要的是,修改此查询以实际上包括特定订单ID的所有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 :(得分:2)

这似乎在序列化的最后一步中,您的序列化程序无法继续执行,因此仅退出而ASP.NET Core将未完成的响应发送给客户端。可能是由于您从OrderItemOrder的反向引用而发生的。假设您正在使用Newtonsoft的Json.NET,请尝试在ReferenceLoopHandling = ReferenceLoopHandling.Ignore中将JsonSerializerSettings设置为Startup.cs

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

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