Entity Framework Core 如何在不使用 Include().ThenInclude() 的情况下从模型中列出一对多从多对多

Posted

技术标签:

【中文标题】Entity Framework Core 如何在不使用 Include().ThenInclude() 的情况下从模型中列出一对多从多对多【英文标题】:Entity Framework Core how to list one to many from many to many from a model without using 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 以急切地加载可能丢失的数据,而不是稍后延迟加载。它影响关系本身。 【参考方案1】:

要明确!

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

更多信息:

https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff649585(v=pandp.10)?redirectedfrom=MSDN http://docs.automapper.org/en/stable/Queryable-Extensions.html https://martinfowler.com/eaaCatalog/dataTransferObject.html

【讨论】:

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

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

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

【讨论】:

以上是关于Entity Framework Core 如何在不使用 Include().ThenInclude() 的情况下从模型中列出一对多从多对多的主要内容,如果未能解决你的问题,请参考以下文章