Это руководство должно быть простым и быстрым, потому что я заметил некоторые трудности/сомнения в Интернете по поводу отношения «многие ко многим», и нет ничего лучше, чем простой пример.

Связь «многие ко многим» между двумя объектами представляет собой отношения «один ко многим» с обеих сторон, т. е. объекты Контакт и Навык.

  • Контакт может иметь один или несколько навыков
  • Навык может присутствовать в одном или нескольких контактах

Это простой и очень важный вопрос для отношений «многие ко многим» в Entity Framework Core.

Руки вверх!

Вы можете найти полное решение в моем репозитории.

Сценарий

Контакт может иметь один или несколько навыков, а навык может принадлежать одному или нескольким контактам. Кроме того, я хотел бы знать уровень экспертизы каждого контакта в каждом навыке.

Итак, для этого сценария нам нужны три объекта: Contact, Skill и ContactSkill.

Я смоделировал домен следующим образом:

Ключевым моментом здесь является сущность ContactSkill. В Entity Framework Core 3.0 необходимо включить в модель объект для представления таблицы соединения. Entity Framework Core 5.0 не нуждается в этой таблице соединений, но в данном случае она необходима, потому что я хочу знать уровень знаний для каждого навыка.

Создание модели

Обратите внимание, нам не нужен список контактов в сущности навыка. Нам просто нужно знать навыки каждого контакта. Это было представлено в нашем modelBuilder с помощью метода WithMany, если вы хотите иметь список в Skills для контактов, вам нужно сделать что-то вроде:

modelBuilder.Entity<ContactSkill>()
 .HasOne(x => x.Skill)
 .WithMany(x => x.Contacts)
 .HasForeignKey(x => x.SkillId);

Давайте проверим это

Пример 1:

Здесь мы создаем все сразу. Создание новых навыков, новых контактов, а затем создание связи между сущностями.

Пример 2:

Здесь мы создаем шаг за шагом и сохраняем в базе данных. Создаем навыки и сохраняем, потом контакты и сохраняем, и только в конце создаем связь между ними. Это просто для того, чтобы показать, что нам не нужно делать все сразу. У нас может быть что-то вроде конечной точки API для создания навыков и другой конечной точки API для создания контактов с навыками или без них, или просто добавлять навыки, когда мы захотим 😊

Вывод

Надеюсь, это поможет кому-то лучше понять отношение многие ко многим. Я рекомендую вам проверять базу данных после каждого взаимодействия. Полное решение доступно в моем репозитории.