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() 的情况下从模型中列出一对多从多对多的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Entity Framework Core 2 中播种?

如何处置 Entity Framework Core 内存数据库

如何在 Entity Framework Core 中将连接字符串传递给 DBContext?

如何使用 Entity Framework Core 正确保存 DateTime?

如何在 .NET Core 3.0 Entity Framework 中执行组加入?

请问在 .NET Core 中如何让 Entity Framework Core 在日志中记录由 LINQ 生成的SQL语句?