Почему Entity Framework V1 несколько раз ударил по БД с помощью SELECT, а сущности уже загружены? - PullRequest
0 голосов
/ 18 марта 2011

Допустим, у меня есть класс Playlist с некоторыми ссылочными классами.Коллекция сущностей списка воспроизведения помещается в оболочку контекста данных:

    public new IQueryable<Playlist> Playlist
    {
        get
        {
            return base.Playlist
                .Include("PlaylistStep")
                .Include("PlaylistStepAttachment");
        }
    }

Контекст разделяется между компонентами приложения на основе каждого веб-запроса.Первый вызов для объектов списков воспроизведения выглядит следующим образом:

            var playlist =
            dataContext
                .Playlist
                .Where(x => x.OwnerUserId == ownerId)
                .OrderBy(x => x.Name)
                .Skip((page - 1) * count)
                .Take(count)
                .ToList();

Это создает соответствующий оператор SQL и загружает некоторые списки воспроизведения в контекст, насколько я понимаю.Затем в том же веб-запросе у меня есть несколько вызовов:

            var playlist = dataContext
                .Playlist
                .Where(x => x.PlaylistId == id)
                .FirstOrDefault();

, где идентификаторы плейлистов такие же, как были получены во время первого запроса.Что удивляет меня, так это то, что последующие вызовы также генерируют операторы SQL, хотя эти объекты уже были загружены в контекст.Я полагаю, что сущности, которые уже находятся в контексте, должны быть возвращены, а не извлечены БД снова.

Может кто-нибудь сказать мне, где я ошибаюсь, или это нормальное поведение для EF?

Ответы [ 2 ]

1 голос
/ 18 марта 2011

это, кажется, объясняет проблему: http://connect.microsoft.com/VisualStudio/feedback/details/511785/implement-caching-in-entity-framework

В настоящее время EF поддерживает только кэш первого уровня из коробки. Кэширование первого уровня - это в основном просто идентификация сущностей в результатах запроса. Все запросы все еще попадают на сервер и возвращают полные результаты сущностей.

0 голосов
/ 18 марта 2011

Поведение, которое вы видите, нормальное, потому что перечисление ObjectQuery<T> всегда выполняет запрос к БД.

Вы можете запросить локально загруженные объекты, посмотрев на ObjectContext.ObjectStateManager. Это прекрасно работает, хотя синтаксис менее интуитивно понятен.

EF 4.1 представляет новое свойство DbSet<T>.Local, которое делает это проще .

...