Система управління базами даних (СУБД) Entity Framework Core є потужним інструментом для роботи з реляційними базами даних в середовищі .NET. Однією з ключових можливостей EF Core є підтримка зв’язків багато-до-одного між об’єктами. У цій статті ми розглянемо ефективне використання такого типу зв’язків із практичними прикладами.
Зв’язок багато-до-одного (one-to-many) в EF Core дозволяє відображати взаємозв’язки між об’єктами даних, де один об’єкт може мати багато дочірніх об’єктів. Це дуже корисно, коли маємо справу з даними, які мають ієрархічну структуру або залежать від більш високого рівня об’єкта.
Для розуміння цього типу зв’язку давайте розглянемо конкретний приклад. Нехай у нас є система керування подіями, де одна подія може мати багато випадків виникнення. У цьому випадку ми маємо два класи: Event та Occurrence.
1 2 3 4 5 6 7 8 9 10 11 12 |
public class Event { public int Id { get; private set; } public List<Occurrence>? Occurrences { get; set; } } public class Occurrence { public int Id { get; private set; } public Event Parent { get; set; } public int ParentId { get; private set; } public int RecurrenceIndex { get; set; } } |
Клас Event має список Occurrences, що дозволяє кожній події мати багато випадків виникнення. Поля Parent та ParentId у класі Occurrence вказують на батьківську подію.
Однією з типових операцій, яку можна виконати з цим типом зв’язку, є вибірка об’єктів за певним критерієм. Наприклад, якщо ми хочемо отримати першу подію, у якій є випадок виникнення з певним індексом, ми можемо скористатися методом Where:
1 2 3 |
dbContext.Events .Where(e => e.Occurrences.Any(o => o.RecurrenceIndex == index)) .FirstOrDefaultAsync(); |
Цей запит поверне першу подію, у якій є Occurrence з вказаним RecurrenceIndex.
Ще один сценарій – отримання батьківського об’єкта разом із відповідним Occurrence в одному запиті. Для цього можна використати метод Join:
1 2 3 4 5 6 7 8 9 10 11 |
var result = await dbContext.Occurrences .Where(o => o.RecurrenceIndex == index) .Join( dbContext.Events, occurrence => occurrence.ParentId, @event => @event.Id, (occurrence, @event) => new { Occurrence = occurrence, Event = @event } ) .FirstOrDefaultAsync(); var parentEvent = result?.Event; var correspondingOccurrence = result?.Occurrence; |
Цей запит об’єднує Occurrences з Events на основі ParentId та Id відповідно і повертає перший результат з відповідним Event та Occurrence.