首页 > 解决方案 > Entity Framework Core 自引用实体 JSON 响应

问题描述

我有一个 .Net Core 3.0 Web API 项目,我使用实体框架作为我的 ORM。我有一个看起来像这样的自引用实体:

public partial class Category
{
    public Category()
    {
        Events = new HashSet<Event>();
        InverseParentCategory = new HashSet<Category>();
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public int? ParentCategoryId { get; set; }

    public virtual Category ParentCategory { get; set; }
    public virtual ICollection<Event> Events { get; set; }
    public virtual ICollection<Category> InverseParentCategory { get; set; }
}

这是我的操作方法,CategoriesController它将所有类别作为 JSON 对象返回:

    [HttpGet]
    public async Task<IActionResult> GetAllCategories()
    {
        var allCategories = await _categoryService.GetCategories();
        return Ok(allCategories);
    }

这是我GetCategories在我的方法CategoryService

    public async Task<IEnumerable<Category>> GetCategories()
    {
        var allCategories = await _context.Categories.ToListAsync();
        return allCategories;
    }

我通过 Postman 得到的回复是这样的:

[
    {
        "id": 1,
        "name": "Soccer",
        "parentCategoryId": null,
        "parentCategory": null,
        "events": [],
        "inverseParentCategory": [
            {
                "id": 3,
                "name": "Basketbal",
                "parentCategoryId": 1,
                "events": [],
                "inverseParentCategory": []
            },
            {
                "id": 4,
                "name": "Volleyball",
                "parentCategoryId": 1,
                "events": [],
                "inverseParentCategory": []
            },
            {
                "id": 5,
                "name": "",
                "parentCategoryId": 1,
                "events": [],
                "inverseParentCategory": []
            },
            {
                "id": 6,
                "name": "dada",
                "parentCategoryId": 1,
                "events": [],
                "inverseParentCategory": []
            }
        ]
    },
    {
        "id": 2,
        "name": "Basketbal",
        "parentCategoryId": null,
        "parentCategory": null,
        "events": [],
        "inverseParentCategory": []
    },
    {
        "id": 3,
        "name": "Basketbal",
        "parentCategoryId": 1,
        "parentCategory": {
            "id": 1,
            "name": "Soccer",
            "parentCategoryId": null,
            "parentCategory": null,
            "events": [],
            "inverseParentCategory": [
                {
                    "id": 4,
                    "name": "Volleyball",
                    "parentCategoryId": 1,
                    "events": [],
                    "inverseParentCategory": []
                },
                {
                    "id": 5,
                    "name": "",
                    "parentCategoryId": 1,
                    "events": [],
                    "inverseParentCategory": []
                },
                {
                    "id": 6,
                    "name": "dada",
                    "parentCategoryId": 1,
                    "events": [],
                    "inverseParentCategory": []
                }
            ]
        },
        "events": [],
        "inverseParentCategory": []
    },
    {
        "id": 4,
        "name": "Volleyball",
        "parentCategoryId": 1,
        "parentCategory": {
            "id": 1,
            "name": "Soccer",
            "parentCategoryId": null,
            "parentCategory": null,
            "events": [],
            "inverseParentCategory": [
                {
                    "id": 3,
                    "name": "Basketbal",
                    "parentCategoryId": 1,
                    "events": [],
                    "inverseParentCategory": []
                },
                {
                    "id": 5,
                    "name": "",
                    "parentCategoryId": 1,
                    "events": [],
                    "inverseParentCategory": []
                },
                {
                    "id": 6,
                    "name": "dada",
                    "parentCategoryId": 1,
                    "events": [],
                    "inverseParentCategory": []
                }
            ]
        },
        "events": [],
        "inverseParentCategory": []
    },
    {
        "id": 5,
        "name": "",
        "parentCategoryId": 1,
        "parentCategory": {
            "id": 1,
            "name": "Soccer",
            "parentCategoryId": null,
            "parentCategory": null,
            "events": [],
            "inverseParentCategory": [
                {
                    "id": 3,
                    "name": "Basketbal",
                    "parentCategoryId": 1,
                    "events": [],
                    "inverseParentCategory": []
                },
                {
                    "id": 4,
                    "name": "Volleyball",
                    "parentCategoryId": 1,
                    "events": [],
                    "inverseParentCategory": []
                },
                {
                    "id": 6,
                    "name": "dada",
                    "parentCategoryId": 1,
                    "events": [],
                    "inverseParentCategory": []
                }
            ]
        },
        "events": [],
        "inverseParentCategory": []
    },
    {
        "id": 6,
        "name": "dada",
        "parentCategoryId": 1,
        "parentCategory": {
            "id": 1,
            "name": "Soccer",
            "parentCategoryId": null,
            "parentCategory": null,
            "events": [],
            "inverseParentCategory": [
                {
                    "id": 3,
                    "name": "Basketbal",
                    "parentCategoryId": 1,
                    "events": [],
                    "inverseParentCategory": []
                },
                {
                    "id": 4,
                    "name": "Volleyball",
                    "parentCategoryId": 1,
                    "events": [],
                    "inverseParentCategory": []
                },
                {
                    "id": 5,
                    "name": "",
                    "parentCategoryId": 1,
                    "events": [],
                    "inverseParentCategory": []
                }
            ]
        },
        "events": [],
        "inverseParentCategory": []
    }
]

所以你可以看到当一个孩子有一个父母时,它会返回父母的数据和它的孩子。我想避免这种情况,但我实际上什么都想不出来。我能得到任何帮助吗?

标签: c#.netentity-framework.net-coreentity-framework-core

解决方案


推荐阅读