【发布时间】:2020-04-05 17:44:22
【问题描述】:
我正在使用实体框架核心和 mySQL 创建一个 ASP.NET Core API,但我在使用 ThenInclude() 列出多对多表中的数据时遇到问题。在 JSON 中发送的数据会一直引用关系而不是关系,直到它发送超过 50kb 的数据。
我尝试了其他方法,例如选择:
var orders = await context.orders.Select(o => new Order
{
id = o.id,
OrderProducts = o.OrderProducts.AsQueryable().Include(x => x.product).ToList(),
ReceiptOrders = o.ReceiptOrders.AsQueryable().Include(x => x.receipt).ToList(),
}).ToListAsync();
但这会不断为产品和多对多表中的收据返回 NULL。有没有人有一个有效的解决方案可以给我我要求的关系,但在那之后没有任何关系。
【问题讨论】:
-
Include与 JSON 没有任何关系。它只影响急切与延迟加载。如果您希望 JSON 具有与实体不同的形状,请使用返回所需形状的Select调用 -
顺便说一句,您没有发布实际查询、实体或您希望结果看起来像什么。如果 JSON.NET 检测到循环引用,他们会抱怨,但这似乎是这里的问题。这意味着做了某事来绕过这些警告。
-
您是否使用
ReferenceLoopHandling = ReferenceLoopHandling.Ignore来忽略 JSON.NET 的警告?您使用的是哪个 ASP.NET Core/EF Core 版本? JSON.NET 是如何配置的? -
@Panagiotis Kanavos 我要说返回的数据一直包括关系与关系。我尝试按照我的问题中所述使用 Select,但我没有给我要求的数据。我想让多对多表包含一对一或多关系。像示例:“OrderProducts = o.OrderProducts.AsQueryable().Include(x => x.product).ToList()”在 Select 函数中我希望多对多表 OrderProducts 也包含一对多返回到产品
-
这就是
circular reference的意思。不是Include的问题,是关系问题和JSON.NET 配置问题。您无需将 anything 放入Select。 整个 查询被转换为 SQL 查询并被执行。Include所做的是告诉 EF Core 生成一个 JOIN 以急切地加载可能丢失的数据,而不是稍后延迟加载。它不影响关系本身。
标签: c# asp.net-web-api json.net entity-framework-core