Хотя этот ответ опоздал на год, возможно, он будет вам полезен (или, по крайней мере, кому-то еще)
Простой ответ таков: не позволяйте Entity Framework выводить отношения m: m. К сожалению, я не знаю, как предотвратить это , только как справиться с этим после факта.
По умолчанию, если у меня есть такая схема:
Employee EmployeeProject Project
----------- --------------- ----------
EmployeeId ---> EmployeeId |--> ProjectId
Name ProjectId ----- Name
... ...
Entity Framework увидит, что моя таблица EmployeeProject
- это простая таблица ассоциаций без дополнительной информации (например, я мог бы добавить поле Date
, чтобы указать, когда они присоединились к проекту). В таких случаях он отображает взаимосвязь через ассоциацию , а не сущность . Это делает код красивым, поскольку помогает уменьшить часто встречающееся несоответствие между СУБД и объектно-ориентированной разработкой. В конце концов, если бы я просто моделировал их как объекты, я бы написал так же, верно?
Однако, как вы видели, это может вызвать проблемы (даже без использования STE, которые вызывают еще БОЛЬШЕ проблем с отношениями m: m). Так что же делать разработчику?
(следующее предполагает использование базы данных ПЕРВЫЙ. Что-нибудь еще, и вы сами)
У вас есть два варианта:
Добавьте еще один столбец в таблицу сопоставлений, чтобы EF посчитал, что он имеет большее значение, и не может сопоставить его с сопоставлением. Это, конечно, плохой дизайн , поскольку вам, вероятно, не нужен этот столбец (в противном случае он у вас уже есть), и вы добавляете его только из-за особых особенностей ORM, который вы ' мы выбрали. Так что не надо.
После того, как ваш контекст сгенерирован, сопоставьте таблицу ассоциации самостоятельно с сущностью, которую вы создаете вручную. Для этого выполните следующие действия:
- Выберите ассоциацию в конструкторе и удалите ее. Дизайнер сообщит вам, что соответствующая таблица больше не отображается, и спросит, хотите ли вы удалить ее из модели. Ответ НЕТ
- Создайте новый объект (не используйте его для создания ключевого свойства) и сопоставьте его с таблицей ассоциации в окне Сведения о сопоставлении
- Щелкните правой кнопкой мыши по вашей новой сущности и добавьте ассоциацию
- Исправьте значения сущности и кратности (слева должна быть ваша ассоциативная сущность с кратностью *, справа должна быть другая сущность с кратностью 1)
- Установите флажок «Добавить свойства внешнего ключа в сущность»
- Повторите для другого субъекта в ассоциации
- Исправьте имена свойств в объекте ассоциации (при желании ... не обязательно, но они почти наверняка ошибочны) и сопоставьте их с соответствующими столбцами в окне Сведения о сопоставлении
- Выберите все скалярные свойства в вашей сущности ассоциации и установите их как EntityKey = True в окне свойств
Готово!