Найти тему
Статьи
Использование record в качестве Command/Query моделей ASP.NET контроллера
В C# 9 появилось новое ключевое слово record для обозначения неизменяемых (immutable) типов данных. Это значит, что вы не можете поменять свойство такого объекта без создания нового экземпляра. Классический пример подобного поведение — хорошо известный тип DateTime. Вместе с ключевым словом добавился и упрощённый синтаксис по объявлению таких типов данных: Объявленные таким сокращенным образом типы данных очень удобно использовать в качестве моделей для запросов и ответов в API. Например: Здесь...
10 месяцев назад
Выполнение фоновых задач в ASP.NET приложениях
При разработке веб-сервисов зачастую возникают задачи, которые следует выполнять не в рамках обработки запросов, а в фоновом режиме. Примерами таких задач могут быть: В каждом из этих случаев удобно иметь некий постоянно либо периодически выполняющийся код, который отвечал бы за свою отдельную задачу. В asp.net доступны несколько способов создания подобных фоновых сервисов: Использование IHostedService Интерфейс IHostedService определяет два метода для реализации: Если вы реализовали интерфейс IHostedService...
10 месяцев назад
Применение миграций EF Core: как можно и как лучше
Подробности того, как реализованы миграции в EF Core, описаны в отдельной заметке. Здесь же разберёмся, как эти самые миграции применять. Применение миграции — это обновление схемы данных конкретной БД. Если для разработки используется несколько стендов с разными БД, то. одни и те же миграции могут быть на каких-то стендах применены, на каких-то нет. На какие-то стенды они должны раскатываться автоматически, а на какие-то в ручном режиме. Применить миграцию можно следующими способами: В обоих этих...
11 месяцев назад
Как в EF Core работают миграции и зачем нужен ModelSnapshot
EF Core при использовании миграций генерирует несколько разных файлов, в которых легко запутаться. Особенно много вопросов возникает при совместной разработке, когда в разных ветках кода создаются разные миграции. Например: Чтобы ответить на эти вопросы, достаточно разобраться, как именно работает механизм миграций. Добавление очередной миграции приводит к следующим изменениям в проекте: На самом деле с точки зрения классов, для каждой миграции создаётся только один новый класс, и он наследуется от базового класса Migration. Просто этот файл с помощью ключевого слова partial разбит на два файла...
11 месяцев назад
EF Core Query Splitting
EF Core при обращении к СУБД по умолчанию формирует один SQL-запрос для получения всех требуемых данных. Иногда это хорошо, т.к. позволяет доставать все необходимые данные одним запросом, а иногда это плохо, т.к. запрос может получиться слишком тяжелым из-за так называемого "комбинаторного взрыва". Как это происходит, рассмотрим подробнее на примере. Предположим, что у вас есть такой набор связанных сущностей: Каждому классу соответствует своя таблица в БД, а связи между ними обеспечиваются внешними ключами...
11 месяцев назад
Разрешение конфликтов конкурентных запросов в EF Core
При обновлении свойств сущности EF Core по умолчанию собирает все изменения в одну транзакцию, которая при выполнении dbContext.SaveChanges() либо применяется целиком, либо полностью откатывается в случае ошибки. Обычно паттерн работы с сущностями выглядит так: достали из базы, обновили свойства, сохранили результат. Для примера представим, что наша сущность - это заказ, у которого есть статус: Тогда обработчик изменения статуса заказа будет выглядеть примерно так: При выполнении последней строки...
11 месяцев назад
Глобальные фильтры в EF Core
Естественным выбором ORM для приложения на .net является EF Core. Эта ORM поддерживает много неочевидных и интересных возможностей, облегчающих решение повседневных задач. Сегодня разберём применение глобальных фильтров. Глобальные фильтры полезны в случаях, когда вам нужно ограничивать доступ к сущностям по определенным правилам, которые повторяются от запроса к запросу. Например: Во всех подобных случаях возникает необходимость добавления дополнительных условий в каждый запрос. Для простоты разберём на примере флага Deleted...
11 месяцев назад