Предыстория
Наверное, многие начинали свое знакомство с Entity Framework с туториалов на сайте entity framework tutorial или Getting Started with Entity Framework 6 Code First using MVC 5 или черпали знания из других источников.
В подавляющем большинстве источников описан подход, когда при CRUD операциях нужный объект загружается из базы в контекст, с ним производятся некоторые действия и изменения сохраняются.
Не так давно узнал про интересную возможность Entity Framework, которая позволит избежать лишних запросов к базе данных.
В подавляющем большинстве источников описан подход, когда при CRUD операциях нужный объект загружается из базы в контекст, с ним производятся некоторые действия и изменения сохраняются.
Не так давно узнал про интересную возможность Entity Framework, которая позволит избежать лишних запросов к базе данных.
Распространенный подход удаления
Удаление сущностей часто производится по уже известному первичному ключу. Для этого используют следующий код:
При выполнении этого кода будет выполнено 2 SQL запроса к базе:
Но я не хочу доставать из базы сущность! Я хочу сразу удалить ее!
Используем Stub Entity
Модифицируем наш код удаления:
Смотрим лог:
Да! Entity Framework сразу отправляет запрос на удаление.
Если запись с узазанным Id существует, она будет удалена. Иначе будет выброшено исключение System.Data.Entity.Infrastructure.DbUpdateConcurrencyException:
Такой подход работает только для поиска по первичному ключу. Если мы попробуем что-то такое:
SQL лог в этом случае:
Как мы видим, Entity Framework генерирует запрос на удаление по первичному ключу, несмотря на то, какие поля заполнены в стабе.
Заключение
Я рассмотрел как можно оптимизировать удаление сущностей используя stub entities. Также можно оптимизировать обновление сущностей и создание сущностей, для которых нужно задать связи с другими сущностями.
Поиграться с кодом можно на GitHub.
Поиграться с кодом можно на GitHub.
Ссылки
- Больше информации можно найти в статье How to avoid database queries using Stub Entities







Комментариев нет:
Отправить комментарий