M2: Персистентность — EF Core + PostgreSQL
На M2 проект защиты учится сохранять данные. Результат парсера из M1 (граф объектов в памяти) записывается в PostgreSQL и переживает перезапуск приложения. Для этого подключается EF Core и концепция миграций.
⚠️ Уровень детализации. Постановка задачи и целевые навыки зафиксированы. Конкретные шаги реализации (структура DbContext, состав конфигураций сущностей, форма тестов) — самостоятельное решение стажёра на основе материалов. Снять пометку и уточнить детали можно после сверки с
intern-development-strategy-design.md.
Срок
Месяц 3 Фазы 1 (~40–60 часов).
Цель
Подключить к проекту защиты PostgreSQL через EF Core. Настроить схему БД так, чтобы доменные классы из M1 (Project, Borehole, Sample, Sample_Lab, ParameterValue) сохранялись и читались. Создать миграции.
Целевые навыки
| Группа | Что осваивается |
|---|---|
| EF Core: основы | DbContext, DbSet<T>, Add, Update, Remove, SaveChangesAsync |
| Конфигурация через Fluent API | OnModelCreating, ToTable, HasKey, Property, связи по FK |
| Миграции | dotnet ef migrations add, database update. Жизненный цикл миграций |
| Прямой доступ к DbContext | Без обёрток Repository/UnitOfWork — это конвенция команды DeepGeo |
| DDD: FK без навигационных свойств | Схема БД отражает домен: связи только по FK, без cross-aggregate navigation |
| Асинхронность | async/await в методах работы с БД (ToListAsync, FirstOrDefaultAsync) |
| Тесты персистентности | Интеграционные тесты: in-memory provider или тестовая БД |
Технологии на M2
Microsoft.EntityFrameworkCore(версия 8.x)Npgsql.EntityFrameworkCore.PostgreSQL— провайдер PostgreSQLMicrosoft.EntityFrameworkCore.Design— для миграций
Задание
Постановка
Настроить персистентность так, чтобы:
- результат парсера из M1 (полный граф доменных объектов) можно было сохранить в PostgreSQL одной операцией;
- после перезапуска приложения данные читались из БД и совпадали с сохранёнными;
- схема БД создавалась миграцией, применимой к чистой БД одной командой.
Требования к результату
DbContext
Создать класс DbContext, предоставляющий доступ ко всем пяти агрегатам. Решить самостоятельно:
- как именно реализован класс (наследование, конструктор, переопределение
OnModelCreating); - в виде одного метода
OnModelCreatingили через отдельные классы-конфигурации сущностей (IEntityTypeConfiguration) — оба варианта допустимы; - как именно настраивать каждую сущность (имена таблиц, типы колонок, ограничения).
Конвенция команды DeepGeo: прямой доступ к DbContext, без обёрток Repository/UnitOfWork. Это сознательное решение, его нужно соблюдать в проекте защиты.
Схема БД
Схема должна отражать домен и соблюдать DDD-конвенцию «только FK»:
- между агрегатами — только FK-колонки, без cross-aggregate navigation properties на уровне EF;
- типы колонок адекватны данным (например, дробные значения — не целые);
- обязательные поля помечены как NOT NULL;
- первичные ключи настроены корректно.
Миграции
Создать минимум одну миграцию, которая:
- создаёт полную схему с нуля;
- применяется к чистой БД через
dotnet ef database updateбез ошибок; - не требует ручного доведения SQL после применения.
End-to-end сценарий
После завершения M2 должна работать цепочка:
- Запустить парсер из M1 на тестовом файле.
- Сохранить результат в БД через
DbContext. - Перезапустить приложение.
- Прочитать данные из БД.
- Убедиться, что прочитанные данные совпадают с тем, что было сохранено (включая связи по FK).
Тесты
Написать интеграционные тесты, проверяющие:
- сохранение и чтение графа объектов (хотя бы базовый сценарий);
- корректность связей по FK после чтения из БД.
Как именно организовать тестовую БД (in-memory provider, отдельная тестовая БД, тестовый контейнер) — самостоятельное решение. Обосновать выбор в README или в комментарии к тестам.
Инженерная культура
- Строка подключения — в
appsettings.json(не хардкод в коде). - Миграции в git, не в
.gitignore. - Коммиты осмысленные, ветки под задачи.
Контрольная точка
В конце месяца 3 — встреча с наставником:
- показать применение миграции к чистой БД;
- продемонстрировать end-to-end сценарий (парсер → БД → чтение после перезапуска);
- показать интеграционные тесты;
- объяснить выбор организации тестовой БД.
Чек-лист завершения M2
-
DbContextсоздан, охватывает все 5 сущностей - Конфигурация через Fluent API
- Миграция создана и применяется к чистой БД
- Парсер → DbContext → SaveChanges → перезапуск → чтение работает
- Интеграционные тесты проходят
- Строка подключения в
appsettings.json, не в коде - Схема соблюдает DDD-конвенцию (только FK между агрегатами)
Материалы по темам
EF Core — основы
- metanit.com — Entity Framework Core — основная глава для M2.
- metanit.com — Первая программа EF Core
- Microsoft Learn — EF Core (RU)
Конфигурация моделей
Миграции
PostgreSQL-провайдер
- Npgsql EF Core Provider — настройка, строка подключения.
Асинхронность в EF Core
Тестирование с EF Core
- Microsoft Learn — Тестирование EF Core (RU) — варианты организации тестовой БД.
Прогресс
[■■■□□] M2 из 5 вех — данные переживают перезапуск.
- ⬅️ M1 — парсер
- ➡️ M3 — Web API — проект начинает говорить по HTTP
- 🐛 QA-трек — параллельный поток работы с багами
- ✅ Чек-листы — критерии прохождения вех
📚 Полный список ресурсов — в разделе Ресурсы.