EF Core Eager Загрузка вложенных коллекций - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь загрузить связанный модал в Entity Framework Core, но по какой-то причине загружается вложенная коллекция, когда я не просил об этом в моем Include() вызове.

Вот мои двамодели -

Driver.cs

public partial class Driver : IBaseEntity
{
    public short DriverId { get; set; }
    public string Surname { get; set; }
    public string Initials { get; set; }
    public byte DriverStatusTypeId { get; set; }

    public DriverStatusType DriverStatusType { get; set; }
}

DriverStatusType.cs

public partial class DriverStatusType
{
    public DriverStatusType()
    {
        Drivers = new HashSet<Driver>();
    }

    public byte DriverStatusTypeId { get; set; }
    public string DriverStatusTypeName { get; set; }
    public string Description { get; set; }

    public ICollection<Driver> Drivers { get; set; }
}

DriversService.cs

public class DriverService : IDriverService
{
    public DriverService(MyContext context)
    {
        Context = context;
    }

    public MyContext Context { get; }

    public async Task<IEnumerable<Driver>> GetAllDrivers()
    {
        var drivers = await Context
            .Drivers
            .Include(d => d.DriverStatusType)
            .toListAsync();

        return drivers;
    }

    public async Task<Driver> GetDriverById(int id)
    {
        var driver = await Context
            .Drivers
            .Include(d => d.DriverStatusType)
            .Where(d => d.DriverId == id)
            .FirstOrDefaultAsync();

        return driver;
    }
}

Теперь, когда я вызываю метод GetDriverById(int id) из моего контроллера, я получаю то, что ожидаю -

{
    "driverId": 1,
    "surname": "Stark",
    "initials": "T",
    "driverStatusTypeId": 2,
    "driverStatusType": {
        "driverStatusTypeId": 2,
        "driverStatusTypeName": "Available",
        "description": "This driver is available",
        "drivers": []
    }
}

Однако метод GetAllDrivers() возвращаетсявложенная коллекция drivers, которая означает, что данные, которые я получаю, огромна -

[
    {
        "driverId": 1,
        "surname": "Stark",
        "initials": "T",
        "displayText": "Tony Stark",
        "driverStatusTypeId": 2,
        "driverStatusType": {
            "driverStatusTypeId": 2,
            "driverStatusTypeName": "Available",
            "description": "This driver is available",
            "drivers": [
                {
                    "driverId": 2,
                    "surname": "Rogers",
                    "initials": "S",
                    "driverStatusTypeId": 2
                },
                {
                    "driverId": 3,
                    "surname": "Romanoff",
                    "initials": "N",
                    "driverStatusTypeId": 2
                },
                {
                    "driverId": 4,
                    "surname": "Banner",
                    "initials": "B",
                    "driverStatusTypeId": 2
                },
                ...

Я думал, что идея быстрой загрузки заключалась в том, чтобы включать только те модели, которые вы указали в операторе включения, но кажется,это не вариант.Может ли кто-нибудь объяснить, что здесь происходит?

1 Ответ

0 голосов
/ 26 ноября 2018

Я думал, что идея быстрой загрузки заключается в том, чтобы включать только те модели, которые вы указали в операторе включения, но, похоже, это не так.Может кто-нибудь объяснить, что здесь происходит?

Вы правы, это не так.Идея быстрой загрузки состоит в том, чтобы обеспечить загруженные вами связанные данные.Это не означает / не гарантирует, что связанные данные не будут включены.

Это частично объясняется в разделе Загрузка связанных данных документации EF Core:

Совет

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

Исправление свойства навигации означаетчто каждый раз, когда экземпляр сущности материализуется, все связанные свойства навигации обновляются, чтобы отразить его, например, Driver добавляется к Driver.DriverStatusType.Drivers и наоборот.

Обратите внимание, что при использовании запросов отслеживания это может произойти после материализован не включающий запрос (ToList()), поскольку средство отслеживания изменений отслеживает ссылки на объекты и автоматически обновляет их при выполнении других запросов отслеживания.

Еще один эффект этого процесса исправлениячто когда вы включаете один из концов отношения, свойство обратной навигации другого конца заполняется автоматически.

Таким образом, даже если в первом случае свойство Drivers должно быть заполнено и содержать один элемент.И это то, что на самом деле происходит в моих чистых тестах, не знаю, почему вы получаете разницу - может быть, сериализатор скрывает это?

В любом случае, все это означает, что вы не можете реально контролировать содержимоесвойства навигации.Единственный способ контролировать то, что вы возвращаете, - это использовать специальные классы DTO / ViewModel и т. Д. И проекцию (Select).

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