# Как использовать Entity Framework Core с MongoDB: подробное руководство по созданию C#-приложения

Источник: https://www.youtube.com/watch?v=fv2-A5e-KHA
Канал: freeCodeCamp.org
Опубликовано: 29.07.2024

---

В современном мире разработки выбор между гибкостью NoSQL и удобством объектно-реляционного маппинга (ORM) часто становился дилеммой. Однако новый провайдер MongoDB для Entity Framework Core призван стереть эти границы, позволяя .NET-разработчикам использовать привычные паттерны Microsoft для работы с документоориентированными данными.

## 🍃 Знакомство с экосистемой: MongoDB и EF Core
[[JUMP:00:00]]

На старте курса Бо Карн (Bo Carnes), инструктор freeCodeCamp.org, дает определение ключевым технологиям стека [0:00]. По его словам, **MongoDB** — это популярная NoSQL-база данных, предназначенная для обработки больших объемов данных с высокой производительностью и масштабируемостью [0:39]. В отличие от традиционных реляционных баз, MongoDB хранит данные в гибких JSON-подобных документах, что позволяет естественным образом описывать сложные структуры [0:53].

Основные характеристики MongoDB:

*   **Хранение данных:** Информация группируется в коллекции, аналогичные таблицам, но без фиксированной схемы [1:05].
*   **Формат BSON:** Хотя документы выглядят как JSON, MongoDB использует бинарный формат BSON для оптимизации производительности и поддержки дополнительных типов данных (целые числа, даты, бинарные данные) [1:57].
*   **Горизонтальное масштабирование:** Данные могут распределяться между множеством серверов, обеспечивая высокую доступность [2:11].

Вторым элементом стека выступает **Entity Framework Core (EF Core)**. Как утверждает Бо Карн, это современный объектно-базовый маппер для .NET, который позволяет разработчикам работать с базой данных через объекты .NET, избавляя от необходимости писать громоздкий код доступа к данным [3:17]. EF Core поддерживает SQL Server, SQLite, а теперь и MongoDB [3:43].

## 🛠️ Как работает провайдер MongoDB для EF Core
[[JUMP:07:31]]

Провайдер выступает «мостом», который позволяет использовать знакомый API и паттерны проектирования EF Core при работе с MongoDB [07:31]. По мнению Бо Карна, это значительно снижает порог вхождения для разработчиков, уже знакомых с экосистемой Microsoft [07:59].

Ключевые возможности провайдера:

1.  **Workflows «Code-First»:** Модели данных определяются в C#, а EF Core генерирует схему MongoDB [08:26].
2.  **Поддержка LINQ:** Запросы к базе пишутся на языке C# без использования специфического синтаксиса MongoDB [08:54].
3.  **Отслеживание изменений (Change Tracking):** EF Core автоматически обнаруживает измененные поля объектов и обновляет только их при сохранении [09:08].
4.  **Вложенные документы:** Поддерживается хранение связанных данных внутри одного документа, что является стандартом для NoSQL [09:21].

## 🏗️ Практика: Создание системы бронирования ресторанов
[[JUMP:14:44]]

В качестве демонстрационного проекта Бо Карн предлагает создать систему резервирования столиков, используя облачную базу данных **MongoDB Atlas** [14:44].

### Настройка базы данных и среды
Для начала работы необходимо создать бесплатный кластер в MongoDB Atlas и загрузить демонстрационный набор данных (*Sample Data*) [15:09]. Бо Карн использует набор `sample_restaurants`, содержащий тысячи записей о заведениях [17:21].

В качестве среды разработки выступает **Visual Studio Code** с установленным расширением **C# Dev Kit** [18:00]. Проект создается на базе шаблона ASP.NET Core MVC [19:21]. Единственный необходимый NuGet-пакет — `MongoDB.EntityFrameworkCore`, который автоматически подтягивает зависимости драйвера MongoDB и самого ядра EF Core [21:37].

### Определение моделей и контекста данных
Для проекта создаются три ключевые модели:

*   **Restaurant:** Описывает заведения (ID, название, кухня, район). Здесь используется атрибут `[Collection]`, который явно указывает на имя коллекции в базе Atlas [23:27].
*   **Reservation:** Описывает бронь (ID, ID ресторана, дата и время) [25:06].
*   **MongoDBSettings:** Вспомогательный класс для хранения URI подключения и имени базы [25:49].

Сердцем интеграции становится класс `RestaurantReservationDbContext`, наследуемый от `DbContext` [26:54]. В нем определяются свойства `DbSet<Restaurant>` и `DbSet<Reservation>`, которые EF Core преобразует в операции с коллекциями. Бо Карн подчеркивает: в методе `OnModelCreating` не нужно вызывать `ToTable`, так как соответствие коллекциям задается атрибутами в моделях [29:33].

## 🔄 Реализация CRUD-операций через репозитории
[[JUMP:33:08]]

Хотя с контекстом данных можно работать напрямую, автор видео рекомендует использовать паттерн «Репозиторий» (Repository Pattern) через сервисы [33:22].

*   **Чтение (Read):** Для получения списка ресторанов используется LINQ. Бо Карн применяет метод `.AsNoTracking()`, который отключает отслеживание изменений, тем самым ускоряя чтение в тех случаях, когда данные не планируется редактировать [37:29]. Также реализована пагинация (ограничение в 20 записей) и сортировка `OrderByDescending` по ID, чтобы новые записи появлялись вверху списка [36:37].
*   **Создание (Create):** Метод `Add` в сервисе добавляет объект в контекст, после чего вызывается `SaveChanges()`.
*   **Обновление (Update):** Объект извлекается из базы, свойства (например, дата бронирования) меняются в коде, и `SaveChanges()` сохраняет изменения [35:56].
*   **Удаление (Delete):** Объект находится по ID и удаляется из `DbSet` [35:16].

## 🧪 Запуск и продвинутые возможности Atlas
[[JUMP:53:15]]

В процессе запуска приложения Бо Карн демонстрирует типичную ошибку: неправильное имя базы данных в `appsettings.json` может привести к пустому списку (база `restaurants` вместо `sample_restaurants`) [53:55]. После исправления конфига приложение успешно выводит данные из облака.

В завершение Бо Карн касается тем, выходящих за рамки стандартного EF Core:

1.  **Atlas Search:** Полнотекстовый поиск с поддержкой автодополнения и ранжирования по релевантности [58:36].
2.  **Vector Search:** Поиск по сходству векторов, необходимый для систем рекомендаций и приложений с использованием машинного обучения [59:55].

Инструктор отмечает, что хотя EF Core упрощает стандартные операции (CRUD), для таких мощных функций, как векторный поиск, по-прежнему требуется прямое использование драйвера `MongoDB.Driver` совместно с EF Core [1:00:34]. Такой гибридный подход позволяет получить лучшее от обоих миров: структурированный доступ к данным и мощь облачных поисковых движков.