EF ядро ​​включает в себя несколько отношений, получая нежелательные данные - PullRequest
0 голосов
/ 31 января 2020

Я модель отношений, как показано ниже

Пост модель

public class Post : BaseEntity
    {
        public int Id { get; set; }
        public string Content { get; set; }
        public string Image { get; set; }

        public virtual User User { get; set; }
        [Column( "user_id" )] public string UserId { get; set; }

        public virtual  List< Comment > Comments { get; set; }
    }

Модель пользователя

public class User : IdentityUser
    {
        public string FirstName { get; set; }

        public string MiddleName { get; set; }

        public string LastName { get; set; }

        [Column( "created_at", Order = 254 )] public DateTime CreatedAt { get; set; }
        [Column( "updated_at", Order = 255 )] public DateTime UpdatedAt { get; set; }

        public virtual ICollection< Post > Posts { get; set; }
        public virtual ICollection< Comment > Comments { get; set; }
    }

Комментарий модели

public class Comment : BaseEntity
    {
        public int Id { get; set; }
        public string Content { get; set; }
        public virtual User User { get; set; }
        [Column( "user_id" )] public string UserId { get; set; }
        public virtual Post Post { get; set; }
        [Column( "post_id" )] public int PostId { get; set; }
    }

И когда я делаю это

public IEnumerable< Post > GetAllPosts()
        {
            return dbContext.Posts
                .Include( post => post.User )
                .ThenInclude( post => post.Comments )
                .ToList();
        }

, я получаю несколько глубин данных. Мне нужен только один уровень ребенка

Это мой вывод только для поста. Данные повторяются.

[
    {
        "id": 5,
        "content": "This post is about fires going on in NSW",
        "image": null,
        "user": { 
            "firstName": "Bikram",
            "middleName": null,
            "lastName": "Bhandari",
            "createdAt": "0001-01-01T00:00:00",
            "updatedAt": "0001-01-01T00:00:00",
            "posts": [], --I don't want this
            "comments": [  -- Unwanted
                {
                    "id": 7,
                    "content": "So sad to see this",
                    "userId": "052b4889-431f-48d2-b673-5835166c03ee",
                    "postId": 5,
                    "createdAt": "0001-01-01T00:00:00",
                    "updatedAt": "0001-01-01T00:00:00"
                },
                {
                    "id": 8,
                    "content": "Let's hope for a rain",
                    "userId": "052b4889-431f-48d2-b673-5835166c03ee",
                    "postId": 5,
                    "createdAt": "0001-01-01T00:00:00",
                    "updatedAt": "0001-01-01T00:00:00"
                }
            ],
            "id": "052b4889-431f-48d2-b673-5835166c03ee",
            "userName": "bikrambhandari48@gmail.com",
            "normalizedUserName": "BIKRAMBHANDARI48@GMAIL.COM",
            "email": "bikrambhandari48@gmail.com",
            "normalizedEmail": "BIKRAMBHANDARI48@GMAIL.COM",
            "emailConfirmed": false,
            "passwordHash": "AQAAAAEAACcQAAAAEHBFj2Woq4/JhqyPWtaXt2xjL4+ML9XQR24pYJsvUAaAKWr/Pg4NgQ2S/O1h8fkerg==",
            "securityStamp": "XVNJKDOYMMT6SP2LLBUNHRKWGT3NZB4X",
            "concurrencyStamp": "2658eced-edd7-4458-b9e2-a010b46e3f37",
            "phoneNumber": null,
            "phoneNumberConfirmed": false,
            "twoFactorEnabled": false,
            "lockoutEnd": null,
            "lockoutEnabled": true,
            "accessFailedCount": 0
        },
        "userId": "052b4889-431f-48d2-b673-5835166c03ee",
        "comments": [
            {
                "id": 7,
                "content": "So sad to see this",
                "user": { --Not wanted
                    "firstName": "Bikram",
                    "middleName": null,
                    "lastName": "Bhandari",
                    "createdAt": "0001-01-01T00:00:00",
                    "updatedAt": "0001-01-01T00:00:00",
                    "posts": [],
                    "comments": [ --Not wanted
                        {
                            "id": 8,
                            "content": "Let's hope for a rain",
                            "userId": "052b4889-431f-48d2-b673-5835166c03ee",
                            "postId": 5,
                            "createdAt": "0001-01-01T00:00:00",
                            "updatedAt": "0001-01-01T00:00:00"
                        }
                    ],
                    "id": "052b4889-431f-48d2-b673-5835166c03ee",
                    "userName": "bikrambhandari48@gmail.com",
                    "normalizedUserName": "BIKRAMBHANDARI48@GMAIL.COM",
                    "email": "bikrambhandari48@gmail.com",
                    "normalizedEmail": "BIKRAMBHANDARI48@GMAIL.COM",
                    "emailConfirmed": false,
                    "passwordHash": "AQAAAAEAACcQAAAAEHBFj2Woq4/JhqyPWtaXt2xjL4+ML9XQR24pYJsvUAaAKWr/Pg4NgQ2S/O1h8fkerg==",
                    "securityStamp": "XVNJKDOYMMT6SP2LLBUNHRKWGT3NZB4X",
                    "concurrencyStamp": "2658eced-edd7-4458-b9e2-a010b46e3f37",
                    "phoneNumber": null,
                    "phoneNumberConfirmed": false,
                    "twoFactorEnabled": false,
                    "lockoutEnd": null,
                    "lockoutEnabled": true,
                    "accessFailedCount": 0
                },
                "userId": "052b4889-431f-48d2-b673-5835166c03ee",
                "postId": 5,
                "createdAt": "0001-01-01T00:00:00",
                "updatedAt": "0001-01-01T00:00:00"
            },
            { --Not wanted
                "id": 8,
                "content": "Let's hope for a rain",
                "user": {
                    "firstName": "Bikram",
                    "middleName": null,
                    "lastName": "Bhandari",
                    "createdAt": "0001-01-01T00:00:00",
                    "updatedAt": "0001-01-01T00:00:00",
                    "posts": [],
                    "comments": [
                        {
                            "id": 7,
                            "content": "So sad to see this",
                            "userId": "052b4889-431f-48d2-b673-5835166c03ee",
                            "postId": 5,
                            "createdAt": "0001-01-01T00:00:00",
                            "updatedAt": "0001-01-01T00:00:00"
                        }
                    ],
                    "id": "052b4889-431f-48d2-b673-5835166c03ee",
                    "userName": "bikrambhandari48@gmail.com",
                    "normalizedUserName": "BIKRAMBHANDARI48@GMAIL.COM",
                    "email": "bikrambhandari48@gmail.com",
                    "normalizedEmail": "BIKRAMBHANDARI48@GMAIL.COM",
                    "emailConfirmed": false,
                    "passwordHash": "AQAAAAEAACcQAAAAEHBFj2Woq4/JhqyPWtaXt2xjL4+ML9XQR24pYJsvUAaAKWr/Pg4NgQ2S/O1h8fkerg==",
                    "securityStamp": "XVNJKDOYMMT6SP2LLBUNHRKWGT3NZB4X",
                    "concurrencyStamp": "2658eced-edd7-4458-b9e2-a010b46e3f37",
                    "phoneNumber": null,
                    "phoneNumberConfirmed": false,
                    "twoFactorEnabled": false,
                    "lockoutEnd": null,
                    "lockoutEnabled": true,
                    "accessFailedCount": 0
                },
                "userId": "052b4889-431f-48d2-b673-5835166c03ee",
                "postId": 5,
                "createdAt": "0001-01-01T00:00:00",
                "updatedAt": "0001-01-01T00:00:00"
            }
        ],
        "createdAt": "0001-01-01T00:00:00",
        "updatedAt": "0001-01-01T00:00:00"
    }
]

Если вы видите выше, вы можете видеть, что данные повторяются. Что я делаю неправильно, чтобы получить все сообщения и пользователя, связанного с сообщением, и все комментарии к сообщению? Кто-нибудь может подсказать, как мне определить мои модельные отношения для лучшего извлечения моих данных? Я хочу получить все сообщения и комментарии с точки зрения пользователя тоже. И в модели комментариев, я хочу знать, к какому посту относится комментарий и кто тоже является владельцем комментария. Заранее спасибо.

1 Ответ

1 голос
/ 31 января 2020

Отслеживание изменений будет фиксировать релизы при загрузке сущностей. Поэтому, если вы загружаете комментарии к Посту и уже загрузили пользователя для некоторых из этих комментариев, будет установлено свойство навигации между пользователем и комментариями.

Если отслеживание изменений включено, то при загрузке объекта EF Core автоматически устанавливает свойства навигации вновь загруженного права доступа для ссылки на любые уже загруженные объекты и задает свойства навигации объекта. уже загруженные объекты для ссылки на вновь загруженный объект.

Загрузка связанных данных - EF Core: явная загрузка

Отключить отслеживание изменений в DbContext для предотвратите это поведение,

public IList< Post > GetAllPosts()
{
    return dbContext.Posts.AsNoTracking()
        .Include( post => post.User )
        .ThenInclude( post => post.Comments )
        .ToList();
}

и верните IList<T>, а не IEnumerable<T>, иначе ваш вызывающий не будет знать, является ли это результатом потоковой передачи, и может защитить результат в списке.

В качестве альтернативы укажите форму документа в вашем сериализаторе JSON.

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