Почему я получаю эту ошибку: для следующего набора EntitySet / AssociationSet - Entity1 не указано сопоставление?

96

Я использую Entity Framework 4 с подходом Model First.

Я начал проект, спроектировал сущности и создал базу данных. Все нормально работало.

Затем мне нужно было вернуться и добавить еще одну сущность в мою модель. Однако когда я перетаскиваю объект в EDMX, я получаю эту ошибку:

введите описание изображения здесь

Хорошо! Мне просто нужно сопоставить Entity1 с таблицей .. Но привет! Я использую подход Model First, я ожидаю, что он создаст для меня таблицу при создании DDL.

Как мне обойти эту ошибку?

Андре Пена
источник
1
Так можно ли сгенерировать сценарий базы данных из вашей модели?
Ладислав Мрнка

Ответы:

147

Это связано с тем, как EF4 работает с моделью сначала.

Когда вы впервые создаете модель «сначала модель», она находится в состоянии, когда SSDL не существует. Вы можете перетаскивать сущности, связывать их и так далее, и все же, если вы посмотрите на SSDL в файле EDMX, вы увидите, что ни один из объектов не имеет связанной таблицы хранения в SSDL.

Это меняется, когда вы щелкаете Generate Database From Modelэлемент контекстного меню. Запутывает то, что это действие делает больше, чем просто генерирует сценарий DDL. Фактически, он изменяет файл EDMX для включения информации SSDL. С этого момента файл EDMX перейдет в состояние, в котором каждая сущность в конструкторе / CSDL должна отображаться на сущность в SSDL. Если не сопоставить, это вызовет ошибку времени компиляции:

Для следующего набора EntitySet / AssociationSet - (EntityName) сопоставление не указано

Еще один интересный факт: это не та ошибка, которая помешает компиляции. Он действительно сгенерирует библиотеку выходных классов. Разве это не должно быть предупреждение или что-то в этом роде?

Чтобы предотвратить эту ошибку, все, что вам нужно сделать после вставки нового объекта, - это Generate Database From Modelснова. Это обновит SSDL и исправит сопоставления.

РЕДАКТИРОВАТЬ

Если вы не используете модель сначала и вы «обновляете из базы данных», у вас также будет эта ошибка в случае удаления таблицы на сервере БД. Это связано с тем, что Entity Framework не удаляет объект автоматически. Удалите объект вручную, и ошибка исчезнет.

Андре Пена
источник
1
У меня возникла та же проблема после обновления моей модели с учетом изменений bd (это не могло быть хорошо, поскольку мой подход не ориентирован на модель).
balanza
5
@balanza, когда вы не используете модель сначала и обновляете свою модель на основе базы данных, вы получите эту ошибку при удалении таблицы на сервере, потому что конструктор EF НЕ удалит объект автоматически. Когда вы вручную удалите тип объекта, ошибка исчезнет
Андре Пена
Я изменил свой прямо в xml-файле модели данных сущности. У меня была куча таблиц и функций, и был риск несоответствия, поэтому я делал это вручную.
Bat_Programmer
Это СУПЕР полезно. Кроме того, если вы используете сначала модель и «обновление из базы данных» и получаете новые таблицы, у вас также будет ошибка. Но запуск «Создать базу данных из модели» (нет необходимости фактически выполнять сгенерированный скрипт - он убьет ваши данные!) Устранит проблемы с отображением в вашем коде, и у вас не будет проблем с его использованием в будущем.
Брайан Уоршоу
1
Как бы вы справились с обновлением схемы для уже развернутой базы данных SQL Server CE? Можно
вынести
35

Я обнаружил, что получаю ту же ошибку, потому что я забыл создать реляционное ограничение после создания связи между двумя объектами.

Mal
источник
13
К вашему сведению: проверьте свойства ассоциации, и внизу «Ссылочное ограничение» будет пустым. Щелкните многоточие и создайте ограничение.
Патрис Кальве
Это мне помогло. Мне пришлось создать отношение 1 .. * от моей исходной сущности к моей навигационной сущности.
duyn9uyen
21

Ошибка 3027: не указано сопоставление для следующего набора EntitySet / AssociationSet ... »- головные боли Entity Framework

Если вы разрабатываете модель с помощью Entities Framework, вы можете иногда сталкиваться с этой досадной ошибкой:

Ошибка 3027: не указано сопоставление для следующего набора EntitySet / AssociationSet [Entity or Association Name]

Это может не иметь смысла, если на EDM все выглядит нормально, но это потому, что эта ошибка обычно не имеет ничего общего с EDM. Он должен сказать: «Восстановите файлы базы данных».

Видите ли, Entities проверяет SSDL и MSL во время сборки, поэтому, если вы только что изменили свой EDM, но не используете Generate Database Model ... тогда он жалуется, что в ваших sql-скриптах чего-то не хватает.

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

Азим Ахмад
источник
Это сработало для той же ошибки, когда
создание
7

В моем случае другой разработчик удалил некоторые таблицы из базовой базы данных. Когда я понял это и удалил эти таблицы из объекта, проблема была решена. Это было не так очевидно, как кажется.

Грэм Лэйт
источник
6

Я столкнулся с той же ошибкой, но я не использовал модель сначала. Оказалось, что каким-то образом мой файл EDMX содержал ссылку на таблицу, хотя она не отображалась в дизайнере. Интересно, что когда я провел текстовый поиск имени таблицы в Visual Studio (2013), таблица не была найдена.

Чтобы решить эту проблему, я использовал внешний редактор (Notepad ++), чтобы найти ссылку на проблемную таблицу в файле EDMX, а затем (осторожно) удалил все ссылки на таблицу. К сожалению, я не знаю, как файл EDMX вообще попал в такое состояние.

летучая оспа
источник
5

У меня было изменение таблицы, и он создал еще один объект с номером 1 в конце (например, MyEntity1и MyEntity), что подтверждено браузером модели edmx. Что-то в двух сущностях вместе запутало обработку.

Удаление таблицы и повторное добавление ее исправили.


Обратите внимание, что если TFS подключена, выполните проверку edmx после удаления. Тогда и только тогда получите последнюю версию и повторно добавьте ее в определенном двухэтапном процессе. В противном случае TFS путается с удалением и повторным добавлением одного и того же названного объекта (ов), что, кажется, вызывает проблемы.

ΩmegaMan
источник
У меня была такая же проблема после смены стола. Я нашел одинаковые сущности с номерами 1 и 2 (MyEntity1, MyEntity2) в нескольких местах под моделью. Я просмотрел все ветки (диаграммы, типы сущностей и т.д.) и удалил все экземпляры MyEntity и MyEntity [n]. Для хорошей меры я сделал «Чистое решение», а затем обновил его из базы данных, чтобы повторно добавить только MyEntity.
MsTapp
4

Для меня более быстрым способом было удалить таблицы и снова добавить их. Он автоматически сопоставил их. :)

Атул К.
источник
2

Для тех, кто использует Database Firstподход, все, что вам нужно сделать после вставки нового объекта, - это Generate Database From Modelснова щелкнуть правой кнопкой мыши по вашему .edmxфайлу и выбратьGenerate Database From Model...

Масуд Дарвишян
источник
0

Была эта ошибка, когда я удалил таблицу из базы данных. Решил это, щелкнув правой кнопкой мыши на диаграмме EDMX, перейдя в Свойства, выбрав таблицу из списка в окне свойств и удалив ее (с помощью клавиши удаления) из диаграммы.

живи любя
источник
0
  1. Перейдите в обозреватель решений, нажмите кнопку поиска.
  2. Оставьте отмеченными оба Search within file contentиSearch External Files
  3. Введите имя объекта, которое ваше отображение не распознает.
  4. Удалите все файлы, связанные с проблемой. Вероятно, они будут названы в честь того же пропавшего объекта. НЕ удаляйте какие-либо файлы с вашим именем класса контекста в файле, особенно если их расширения - .cs или .tt. В файле Context .cs .
  5. удалите все строки кодов, относящиеся к отсутствующему объекту. Они будут выглядеть так:

    public virtual DbSet< Entity1> Entity1 { get; set; }

Эта ошибка характерна для таблиц, удаленных из базы данных.

Когда вы удаляете таблицу в базе данных или просто меняете ее web.config.connectionStringsдля базы данных EF Mapped, проблема заключается в том, чтобы указать на новую, а не на ту, которая использовалась для создания исходных сопоставлений.

Это новая база данных, этих сущностей с ошибкой 3027 нет.

MarcoSantana
источник
0

У меня была ошибка, когда я пытался создать собственный результат для хранимой процедуры и предполагал, что это должен быть объект.

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

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

Томас Келле
источник
0

Я установил все правильно (мощности и зависимые свойства), но не мог понять, почему продолжаю получать ошибку. Наконец выяснилось, что EF самостоятельно сгенерировал столбец в зависимой таблице (table_tablecolumn), и он не имеет никакого отношения к таблице, поэтому сопоставление не было указано. Мне пришлось удалить столбец в файле EDMX и восстановить решение, которое устранило проблему. Я использую подход БД.

user2965957
источник
0

Обновить модель из базы данных у меня не работает.

Мне пришлось удалить конфликтующий объект, затем выполнить «Обновить модель из базы данных» и, наконец, перестроить решение. После этого все работает нормально.

Вилли Дэвид младший
источник
0

Делитесь этим с другими людьми. В моем случае мы работали над общим решением MVC и использовали общий модуль для таблиц, которые мы используем для раскрывающихся списков. Я получил ошибку, когда обновил модель Entity, добавив новую таблицу. Оказывается, когда я обновил EDMX, он, вероятно, обновил мои права доступа к базе данных, что привело к тому, что я не имел доступа к этой определенной таблице no mapping specified.

Просто повторное добавление и предоставление доступа моему пользователю решило проблему.

ОчаровательныVB
источник
0

Думаю, я получил это из-за того, что не удалил явно некоторые таблицы из edmx перед их переименованием и повторным добавлением. Вместо этого я просто переименовал таблицы, а затем выполнил «Обновить модель из базы данных», думая, что они исчезнут, и удалим их из модели. Затем я сделал еще одну модель обновления из базы данных и добавил переименованные таблицы.

Сайт работал с новыми таблицами, но у меня была ошибка. В конце концов, я заметил, что исходные таблицы все еще присутствуют в модели. Я удалил их из модели (щелкните их на экране edmx, удалите ключ), а затем ошибка исчезла.

apswrk
источник