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核心将未完成的响应发送给客户端。发生这种情况可能是因为您从 OrderItem
到 Order
的反向引用。假设您使用的是 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]
属性,这当然意味着它永远不会出现在您的任何回复中。
我正在使用 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核心将未完成的响应发送给客户端。发生这种情况可能是因为您从 OrderItem
到 Order
的反向引用。假设您使用的是 Newtonsoft 的 Json.NET,请尝试在 Startup.cs
.
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddJsonOptions(
o => o.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore
);
}
另一种选择是简单地将 OrderItem
中的 Order
从序列化中排除,例如但是,通过 [JsonIgnore]
属性,这当然意味着它永远不会出现在您的任何回复中。