Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework core EF核心-为什么';infinate';嵌套加载?_Entity Framework Core - Fatal编程技术网

Entity framework core EF核心-为什么';infinate';嵌套加载?

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() {

我在两个实体之间有一对多的关系:映射和映射节点。当我使用映射(通过Include())加载MapNodes时,我会得到Map,并得到相关的MapNodes,但在相关的MapNodes中,我还会再次得到完整的父映射。然后,该贴图具有关联的贴图节点(再次),依此类推

我需要将查询的内容限制在一个级别(即MapNodes),而不需要进一步加载

[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": [
                        ...