Это руководство должно быть простым и быстрым, потому что я заметил некоторые трудности/сомнения в Интернете по поводу отношения «многие ко многим», и нет ничего лучше, чем простой пример.
Связь «многие ко многим» между двумя объектами представляет собой отношения «один ко многим» с обеих сторон, т. е. объекты Контакт и Навык.
- Контакт может иметь один или несколько навыков
- Навык может присутствовать в одном или нескольких контактах
Это простой и очень важный вопрос для отношений «многие ко многим» в 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 для создания контактов с навыками или без них, или просто добавлять навыки, когда мы захотим 😊
Вывод
Надеюсь, это поможет кому-то лучше понять отношение многие ко многим. Я рекомендую вам проверять базу данных после каждого взаимодействия. Полное решение доступно в моем репозитории.