【问题标题】:Entity Framework Core how to list one to many from many to many from a model without using Include().ThenInclude()Entity Framework Core 如何在不使用 Include().ThenInclude() 的情况下从模型中列出一对多从多对多
【发布时间】: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


【解决方案1】:

要明确!

听起来很奇怪,但您不应该为序列化程序提供 EF 实体。它可能会尝试序列化整个数据库。定义一个对象(结构)并用所需的数据填充它。我们想将这些称为 DTO(数据传输对象)。

更多信息:

【讨论】:

  • 很抱歉回复晚了,但你是对的。在越来越多地使用 EF Core 之后,我现在将 DTO 用于发送给客户端或提供给 API 的所有内容
【解决方案2】:

使用存储过程得到准确的结果

context.Database.SqlQuery("调用存储过程").ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    • 2018-02-21
    • 1970-01-01
    • 2021-07-31
    • 2022-01-17
    • 1970-01-01
    相关资源
    最近更新 更多