. net Core 3.0 сущность бесконечный цикл - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть некоторые проблемы с. net основной сущностью при получении данных.

это мой код контроллера

_context.Hierarchies
    .Include(i => i.Children)
    .AsEnumerable()
    .Where(x => x.Parent == null)
    .ToList();

и это мой класс модели

   public class Hierarchy
    {
        public Hierarchy()
        {
            CreatedDate = DateTime.UtcNow;
            Children = new List<Hierarchy>();
        }
        public long Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public User CreatedBy { get; set; }
        public DateTime CreatedDate { get; set; }
        public Organization Organization { get; set; }
        public List<Task> Tasks{ get; set; }
        public Hierarchy Parent { get; set; }
        public long? ParentId { get; set; }
        public List<Hierarchy> Children { get; set; }
    }

и это мой построитель модели контекста БД

 modelBuilder.Entity<Hierarchy>(hierarchy => {
                hierarchy.HasMany(c => c.Children)
                .WithOne(c => c.Parent)
                .HasForeignKey(c => c.ParentId);
            });

При вызове мой API-результат будет

[
    {
        "id": 16,
        "name": "category1",
        "description": null,
        "createdBy": {
            "id": 2,
            "email": "test@test.com",
            "passwordHash": "IR4uM8YiGpzevGjNYQHfFgFBkHqTqGy3rgCsA8d9LNZAmTItvy2l3MXSnPcXQD7QldV3X5GA/CKSF4mPCFkAYg==",
            "passwordSalt": "XWzpfAf8IA7wpgY+gtVHiGPxTX4avvn38VY7MFspMhAfPUwL1a9ctuSQcEPlRJKqfK/3yZRtPWUlMQV7XH0JHRd4bKFvH/NKpSr4v46vOlgdQWAZDH1dklmqPtCmYK/Rq8SC/qcKfrmQLbJewBJ7B1Fse33ohAXp29+0K1c4YsE=",
            "name": null,
            "avatar": null,
            "address": null,
            "aboutMe": null,
            "company": null,
            "job": null,
            "city": null,
            "country": null,
            "birthday": "0001-01-01T00:00:00",
            "createdDate": "2020-04-08T02:38:40.288739",
            "userOrganizations": null,
            "ownerTasks": null,
            "assignedTasks": null,
            "assigneeTasks": null,
            "currentOrganization": {
                "id": 2,
                "name": "Default",
                "description": "",
                "createdDate": "2020-04-07T23:38:40.459297",
                "userOrganizations": [],
                "hierarchies": [
                    {
                        "id": 17,
                        "name": "category2",
                        "description": null,
                        "createdDate": "2020-04-08T02:09:46.1474742Z",
                        "tasks": [],
                        "parentId": 16,
                        "children": []
                    }
                ]
            }
        },
        "createdDate": "2020-04-08T02:09:34.54658",
        "organization": {
            "id": 2,
            "name": "Default",
            "description": "",
            "createdDate": "2020-04-07T23:38:40.459297",
            "userOrganizations": [],
            "hierarchies": [
                {
                    "id": 17,
                    "name": "category2",
                    "description": null,
                    "createdBy": {
                        "id": 2,
                        "email": "test@test.com",
                        "passwordHash": "IR4uM8YiGpzevGjNYQHfFgFBkHqTqGy3rgCsA8d9LNZAmTItvy2l3MXSnPcXQD7QldV3X5GA/CKSF4mPCFkAYg==",
                        "passwordSalt": "XWzpfAf8IA7wpgY+gtVHiGPxTX4avvn38VY7MFspMhAfPUwL1a9ctuSQcEPlRJKqfK/3yZRtPWUlMQV7XH0JHRd4bKFvH/NKpSr4v46vOlgdQWAZDH1dklmqPtCmYK/Rq8SC/qcKfrmQLbJewBJ7B1Fse33ohAXp29+0K1c4YsE=",
                        "name": null,
                        "avatar": null,
                        "address": null,
                        "aboutMe": null,
                        "company": null,
                        "job": null,
                        "city": null,
                        "country": null,
                        "birthday": "0001-01-01T00:00:00",
                        "createdDate": "2020-04-08T02:38:40.288739",
                        "userOrganizations": null,
                        "ownerTasks": null,
                        "assignedTasks": null,
                        "assigneeTasks": null
                    },
                    "createdDate": "2020-04-08T02:09:46.1474742Z",
                    "tasks": [],
                    "parentId": 16,
                    "children": []
                }
            ]
        },
        "tasks": null,
        "parent": null,
        "parentId": null,
        "children": [
            {
                "id": 17,
                "name": "category2",
                "description": null,
                "createdBy": {
                    "id": 2,
                    "email": "test@test.com",
                    "passwordHash": "IR4uM8YiGpzevGjNYQHfFgFBkHqTqGy3rgCsA8d9LNZAmTItvy2l3MXSnPcXQD7QldV3X5GA/CKSF4mPCFkAYg==",
                    "passwordSalt": "XWzpfAf8IA7wpgY+gtVHiGPxTX4avvn38VY7MFspMhAfPUwL1a9ctuSQcEPlRJKqfK/3yZRtPWUlMQV7XH0JHRd4bKFvH/NKpSr4v46vOlgdQWAZDH1dklmqPtCmYK/Rq8SC/qcKfrmQLbJewBJ7B1Fse33ohAXp29+0K1c4YsE=",
                    "name": null,
                    "avatar": null,
                    "address": null,
                    "aboutMe": null,
                    "company": null,
                    "job": null,
                    "city": null,
                    "country": null,
                    "birthday": "0001-01-01T00:00:00",
                    "createdDate": "2020-04-08T02:38:40.288739",
                    "userOrganizations": null,
                    "ownerTasks": null,
                    "assignedTasks": null,
                    "assigneeTasks": null,
                    "currentOrganization": {
                        "id": 2,
                        "name": "Default",
                        "description": "",
                        "createdDate": "2020-04-07T23:38:40.459297",
                        "userOrganizations": [],
                        "hierarchies": []
                    }
                },
                "createdDate": "2020-04-08T02:09:46.1474742Z",
                "organization": {
                    "id": 2,
                    "name": "Default",
                    "description": "",
                    "createdDate": "2020-04-07T23:38:40.459297",
                    "userOrganizations": [],
                    "hierarchies": []
                },
                "tasks": [],
                "parentId": 16,
                "children": []
            }
        ]
    }
]

он будет создан createBy -> currentOrganization -> иерархия

мне не нужно currentOrganization и иерархия, также объект createBy имеет пароль пользователяHa sh

как я могу настроить свое возвращаемое значение;

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

мне не нужна currentOrganization и иерархия также создана. У объекта есть пароль пользователяHa sh

Кажется, вы не хотите показывать currentOrganization, hierarchy и passwordHash в createdBy object.

Вот два способа выбора возвращаемого значения:

1.Используйте атрибут JsonIgnore:

public class Hierarchy
{
    public Hierarchy()
    {
        CreatedDate = DateTime.UtcNow;
        Children = new List<Hierarchy>();
    }
    public long Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public User CreatedBy { get; set; }
    public DateTime CreatedDate { get; set; }
    public Organization Organization { get; set; }       
    public Hierarchy Parent { get; set; }
    public long? ParentId { get; set; }
    public List<Hierarchy> Children { get; set; }
}
public class User
{
    public int Id { get; set; }
    public string Email { get; set; }
    //more properties...
    [Newtonsoft.Json.JsonIgnore]
    public string PasswordHash { get; set; }
    [Newtonsoft.Json.JsonIgnore]
    public Organization CurrentOrganization { get; set; }
}
public class Organization
{
    public int Id { get; set; }
    public string Name { get; set; }
    //more properties...
    public List<Hierarchy> Hierarchies { get; set; }
}

Контроллер:

var d = _context.Hierarchies
            .Include(i=>i.Organization)
            .Include(i => i.Children)
            .Include(i => i.CreatedBy)
            .Where(x => x.Parent == null)
            .AsEnumerable()
            .ToList();

Startup.cs:

services.AddControllersWithViews().AddNewtonsoftJson(options =>
{
    options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});

2. Создать новую модель представления:

Модель представления:

public class HierarchyViewModel
{
    public long Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public UserViewModel CreatedBy { get; set; }

    public DateTime CreatedDate { get; set; }

    public Organization Organization { get; set; }

    public Hierarchy Parent { get; set; }
    public long? ParentId { get; set; }
    public List<Hierarchy> Children { get; set; }
}
public class UserViewModel
{
    public int Id { get; set; }
    public string Email { get; set; }
}

Контроллер:

var d = _context.Hierarchies
            .Include(i=>i.Organization)
            .Include(i => i.Children)
            .Include(i => i.CreatedBy)
            .Where(x => x.Parent == null)
            .Select(x => new HierarchyViewModel()
            {
                Id = x.Id,
                CreatedDate = x.CreatedDate,
                Description = x.Description,
                Name = x.Name,
                Parent = x.Parent,
                Children = x.Children,
                CreatedBy = new UserViewModel()
                {
                    Id = x.CreatedBy.Id,
                    Email = x.CreatedBy.Email
                },
                ParentId = x.ParentId,
                Organization = x.Organization
            }).ToList();

Результат:

[
  {
    "id": 9,
    "name": "bbb",
    "description": "abb",
    "createdBy": {
      "id": 3,
      "email": "email2"
    },
    "createdDate": "2019-08-07T00:00:00",
    "organization": {
      "id": 1,
      "name": "org1",
      "hierarchies": [
        {
          "id": 8,
          "name": "asd",
          "description": "sda",
          "createdBy": null,
          "createdDate": "2019-08-06T00:00:00",
          "parent": null,
          "parentId": 9,
          "children": []
        }
      ]
    },
    "parent": null,
    "parentId": null,
    "children": [
      {
        "id": 8,
        "name": "aaa",
        "description": "aaa",
        "createdBy": null,
        "createdDate": "2019-08-06T00:00:00",
        "organization": {
          "id": 1,
          "name": "org1",
          "hierarchies": []
        },
        "parent": null,
        "parentId": 9,
        "children": []
      }
    ]
  }
]
1 голос
/ 08 апреля 2020

Это зависит от того, как вы сериализуете свою модель. Но в целом, создание DTO, возвращающего только связанные данные, может быть лучшим выбором в большинстве случаев. В вашем случае DTO может включать только IserId вместо объекта User. Кроме того, если вы настаиваете на возвращении сущности базы данных, вы можете установить значения объекта «null» перед возвратом или не включать «включая» несвязанные объекты, пока вы извлекаете сущность из базы данных. ,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...