четверг, 24 сентября 2015 г.

Entity Framework: Stub Entities или как избежать лишних запросов к базе данных

Предыстория

Наверное, многие начинали свое знакомство с Entity Framework с туториалов на сайте entity framework tutorial или Getting Started with Entity Framework 6 Code First using MVC 5 или черпали знания из других источников.

В подавляющем большинстве источников описан подход, когда при CRUD операциях нужный объект загружается из базы в контекст, с ним производятся некоторые действия и изменения сохраняются.

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

Распространенный подход удаления

Удаление сущностей часто производится по уже известному первичному ключу. Для этого используют следующий код:


При выполнении этого кода будет выполнено 2 SQL запроса к базе:


Но я не хочу доставать из базы сущность! Я хочу сразу удалить ее!

Используем Stub Entity

Модифицируем наш код удаления:


Смотрим лог:


Да! Entity Framework сразу отправляет запрос на удаление.
Если запись с узазанным Id существует, она будет удалена. Иначе будет выброшено исключение System.Data.Entity.Infrastructure.DbUpdateConcurrencyException:



Такой подход работает только для поиска по первичному ключу. Если мы попробуем что-то такое:


SQL лог в этом случае:


Как мы видим, Entity Framework генерирует запрос на удаление по первичному ключу, несмотря на то, какие поля заполнены в стабе.

Заключение

Я рассмотрел как можно оптимизировать удаление сущностей используя stub entities. Также можно оптимизировать обновление сущностей и создание сущностей, для которых нужно задать связи с другими сущностями.

Поиграться с кодом можно на GitHub.

Ссылки