Entity framework 6, ставлення багато-до-багатьох (many-to-many) між таблицями

Entity Framework підтримує реалізацію відносини багато-до-багатьох (many-to-many) між таблицями в базі даних. Такий зв'язок в реляційних базах даних забезпечується за рахунок використання проміжної таблиці, з якою зв'язуються дві інші таблиці через ставлення один-ко-многим. В результаті між цими двома таблицями утворюється зв'язок багато-до-багатьох. Фактично в такого зв'язку немає головної і залежної таблиці, як ми описували це для зв'язків один-до-одного і один-до-багатьох, проміжна таблиця є залежною від двох головних таблиць.

Давайте продовжимо розгляд нашого прикладу моделі, в якій ми визначили таблицю покупця і його замовлення. У таблиці замовлень (Orders) ми використовували поля, що описують найменування товару та його вартість. Очевидно, що використання такої структури бази даних є неефективним. Більш правильний підхід, передбачає створення таблиці Product, в якій міститься колекція товарів для магазину, а між таблицями Product і Customer потрібно створити відношення багато-до-багатьох за рахунок використання проміжної таблиці Orders. Тобто в контексті нашого прикладу зв'язок багато-до-багатьох говорить про те, що один покупець може замовити кілька товарів, і один товар може бути замовлений декількома покупцями.

Давайте реалізуємо таку модель в Code-First. Нижче показана структура моделі, при якій Entity Framework автоматично розпізнає зв'язок багато-до-багатьох між двома таблицями Customers і Products (ми видалили клас Profile, який використовували під час обговорення відносини один-до-одного в попередній статті, а також клас Order):

Якщо ви запустите додаток, то Entity Framework автоматично відтворить базу даних, тому що модель змінилася. Code-First зможе розпізнати зв'язок між цими класами як багато-до-багатьох і створить проміжну таблицю, яка містить зовнішні ключі, що посилаються на таблиці Customers і Products, як показано на малюнку нижче:

Entity framework 6, ставлення багато-до-багатьох (many-to-many) між таблицями

Варто відзначити, що ці зовнішні ключі є і первинними ключами проміжної таблиці. Ім'я проміжної таблиці складається з імен двох зв'язаних таблиць, в нашому прикладі вона має ім'я ProductCustomers. Імена згенерованих зовнішніх ключів йдуть тим же угодами, що ми описали раніше. Після того, як відношення багато-до-багатьох визначено, Entity Framework знає, які потрібно використовувати SQL-оператори для вставки, видалення і оновлення даних в зв'язаних таблицях.

Зв'язок багато-до-багатьох можна також налаштувати, використовуючи засоби Fluent API. Це може знадобитися тоді, коли ви використовуєте кілька зв'язків між таблицями, щоб явно вказати пару навігаційних властивостей, що забезпечують реалізацію цього відносини. Нижче показаний приклад цієї настройки:

Зверніть увагу, що тут ми явно задаємо ім'я проміжної таблиці при виклику допоміжного методу Map (), в результаті чого Entity Framework створить при запуску прикладу таблицю з ім'ям Orders, а не ProductCustomers.

Ми також явно задаємо імена зовнішніх ключів, використовуючи методи MapLeftKey () і MapRightKey () об'єкта конфігурації ManyToManyAssociationMappingConfiguration, який передається методу Map () в параметрі делегата Action. Ці методи вказують лівий і правий ключі для проміжної таблиці. Щоб їх не переплутати, ви повинні запам'ятати просте правило, лівий ключ вказує на клас суті, для якого ми викликали метод HasMany () раніше, а правий ключ вказує на клас суті, для якого ми викликали метод WithMany (). Якщо ви їх переплутати нічого страшного не станеться, просто зовнішній ключ CustomerId буде посилатися на таблицю Product, а зовнішній ключ ProductId на таблицю Customer.

Схожі статті