Каковы издержки отслеживания Entity Framework? - PullRequest
3 голосов
/ 24 ноября 2011

Я только что говорил с коллегой об отслеживании изменений Entity Framework.В итоге мы выяснили, что мой контекстный интерфейс должен иметь

IDBSet<MyPoco> MyThings { get; }

, а не

IQueryable<MyPoco> MyThings { get; }

, и что мой POCO также должен иметь все свои свойства как virtual.

* 1009.* Используя отладчик, мы могли бы видеть объекты отслеживания, а также, что результаты содержали прокси для моих фактических POCO.

Если у меня нет свойств POCO как virtual и мой контекстный интерфейс использует IQueryable<> вместо IDbSet<> я ничего не получаю.

В этом случае я только запрашиваю базу данных, но в будущем захочу обновить базу через Entity Framework.

Итак, чтобы облегчить мне жизнь в будущем, когда я приду к этому коду в качестве справочного материала, есть ли какое-то ухудшение производительности, если я не буду использовать их для отслеживания информации / прокси-серверов?

Ответы [ 2 ]

3 голосов
/ 24 ноября 2011

Существует снижение производительности при прикреплении сущностей в EF.Когда вы выполняете запрос с использованием Entity Framework, EF будет сохранять копию значений, загруженных из базы данных.Также один экземпляр Context отслеживает только один экземпляр объекта.Поэтому EF должен проверить, есть ли у него уже копия объекта, прежде чем он создаст экземпляр (т. Е. Будет много сравнений, идущих за кулисы).

Поэтому избегайте этого, если вам это не нужно,Это можно сделать следующим образом.

IQueryable<MyPoco> MyThings { get { return db.MyThings.AsNoTracking(); } }

Страница MSDN на Этапы выполнения запроса подробно описывает стоимость, связанную с каждым этапом выполнения запроса.

Редактировать:

Вы не должны выставлять IDBSet<MyPoco> MyThings, потому что это говорит потребителю вашего API, что ваши сущности могут быть добавлены, обновлены и удалены, когда фактически вы намереваетесь запросить данные.

2 голосов
/ 24 ноября 2011

Свойства навигации в классах модели объявлены как виртуальные, что подразумевает функцию отложенной загрузки, которая означает, что свойство навигации будет необходимо только при необходимости.Что касается объектов Entity, то главная цель состоит в том, чтобы загрузить конкретные записи таблицы из базы данных в DbSet, который приходит из DbContext.Вы не можете использовать IQueryable в этом случае.Кроме того, это не имеет никакого смысла с DataContext.IQueryable - это совершенно другой интерфейс

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