Entity framework core EF核心-为什么';infinate';嵌套加载?
我在两个实体之间有一对多的关系:映射和映射节点。当我使用映射(通过Include())加载MapNodes时,我会得到Map,并得到相关的MapNodes,但在相关的MapNodes中,我还会再次得到完整的父映射。然后,该贴图具有关联的贴图节点(再次),依此类推 我需要将查询的内容限制在一个级别(即MapNodes),而不需要进一步加载Entity framework core EF核心-为什么';infinate';嵌套加载?,entity-framework-core,Entity Framework Core,我在两个实体之间有一对多的关系:映射和映射节点。当我使用映射(通过Include())加载MapNodes时,我会得到Map,并得到相关的MapNodes,但在相关的MapNodes中,我还会再次得到完整的父映射。然后,该贴图具有关联的贴图节点(再次),依此类推 我需要将查询的内容限制在一个级别(即MapNodes),而不需要进一步加载 [Table("maps")] public partial class Maps { public Maps() {
[Table("maps")]
public partial class Maps
{
public Maps()
{
MapNodes = new HashSet<MapNodes>();
}
<...>
[InverseProperty("Map")]
public virtual ICollection<MapNodes> MapNodes { get; set; }
}
[Table("map_nodes")]
public partial class MapNodes
{
public MapNodes()
{
}
<...>
[Column("map_id", TypeName = "int(10) unsigned")]
public uint MapId { get; set; }
public Maps Map { get; set; }
}
我收到了一封信:
{
"id": 1063,
"mapNodes": [
{
"id": 25784,
"mapId": 1063,
"map": {
"id": 1063,
"mapNodes": [
{
"id": 25784,
"mapId": 1063,
"map": {
"id": 1063,
"mapNodes": [
...
Microsoft用自己的实现取代了ASP.NET Core 3中的
Microsoft.AspNetCore.Mvc.NewtonsoftJson
,该实现是System.Text.Json
,但它还不支持引用循环处理
处理
因此,为了配置引用循环处理
,您需要为Microsoft.AspNetCore.Mvc.NewtonsoftJson添加nuget包
,然后通过以下方式进行配置:
services.AddControllersWithViews().AddNewtonsoftJson(选项=>{
options.SerializerSettings.ReferenceLoopHandling=ReferenceLoopHandling.Ignore;
});
这称为参考循环处理
。它在System.Text.Json
中还不可用。但是它可以在Microsoft.AspNetCore.Mvc.NewtonsoftJson
中使用,在startup
中,您可以通过AddControllersWithViews().AddNewtonsoftJson()和x.SerializerSettings.ReferenceLoopHandling=ReferenceLoopHandling.Ignore对其进行配置代码>。谢谢!你能发布一个解决方案吗?我会“接受”它。如果你查询相关实体(使用包含),EF生成的对象将始终包含循环引用。更好的选择是创建一组类来表示平面数据(Response/DTO/ViewModel对象),并在将数据发送到客户端之前将实体/模型对象映射到这些对象,而不是直接发送查询结果。
{
"id": 1063,
"mapNodes": [
{
"id": 25784,
"mapId": 1063,
"map": {
"id": 1063,
"mapNodes": [
{
"id": 25784,
"mapId": 1063,
"map": {
"id": 1063,
"mapNodes": [
...