Чому я отримую цю помилку: Не вказано відображення для наступних EntitySet / AssociationSet - Entity1?


96

Я використовую Entity Framework 4 з підходом Model First.

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

Тоді мені потрібно було повернутися назад і додати ще одну сутність до моєї моделі. Однак, перетягуючи сутність до EDMX, я отримую цю помилку:

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

Добре! Мені просто потрібно віднести Entity1 до таблиці .. Але ей! Я використовую підхід Model First, я очікую, що він створить таблицю для мене, коли я буду генерувати DDL.

Як мені обійти цю помилку?


1
Тож може згенерувати сценарій бази даних з вашої моделі?
Ladislav Mrnka

Відповіді:


147

Це пов’язано з тим, як EF4 працює з першими моделями.

Коли ви вперше створюєте першу модель, вона перебуває в стані, що SSDL не існує. Ви можете перетягувати сутності, асоціювати їх тощо, і все ж, якщо ви подивитесь на SSDL у файлі EDMX, ви побачите, що жоден з об’єктів не має пов’язаної таблиці зберігання в SSDL.

Це змінюється після натискання Generate Database From Modelпункту контекстного меню. Збиває з пантелику те, що ця дія не просто генерує DDL-сценарій. Фактично, він змінює файл EDMX, щоб включати інформацію SSDL. З цього моменту файл EDMX перейде у стан, при якому кожна сутність у конструкторі / CSDL повинна зіставитись із суттю в SSDL. Якщо ніхто не зіставить, це спричинить помилку часу компіляції:

Не вказано відображення для наступних EntitySet / AssociationSet - (EntityName)

Ще одним цікавим фактом є те, що не така помилка перешкоджає компіляції. Це справді генеруватиме вихідну бібліотеку класів. Це не повинно бути попередженням чи чимсь?

Щоб запобігти цій помилці, все, що вам потрібно зробити після вставлення нової сутності, це Generate Database From Modelзнову. Це оновить SSDL та виправить відображення.

EDIT

Якщо ви не використовуєте model-first і "оновлюєте з бази даних", ця помилка також з'явиться у випадку, якщо ви видалили таблицю на сервері DB. Це пов’язано з тим, що Entity Framework не буде автоматично видаляти сутність для вас. Видаліть сутність вручну, і помилка зникне.


1
Я отримав таку ж проблему після оновлення своєї моделі проти змін bd (це не могло бути добре, оскільки мій підхід не є першим на моделі).
balanza

5
@balanza, коли ви не використовуєте спочатку модель і оновлюєте свою модель на основі бази даних, ви отримаєте цю помилку, коли ви видалите таблицю на сервері, оскільки дизайнер EF НЕ видалить сутність автоматично. Коли ви вручну видаляєте тип сутності, помилка зникне
Андре Пена,

Я змінив свій безпосередньо у файлі xml моделі даних сутності. У мене було багато таблиць і функцій, і існував ризик невідповідності, тому я зробив це вручну.
Bat_Programmer

Це СУПЕР корисно. Крім того, якщо ви використовуєте model-first та "оновлення з бази даних" і отримуєте нові таблиці, ви також матимете помилку. Але запуск Generate Database from Model (не потрібно фактично виконувати згенерований сценарій - це вб’є ваші дані!) Вирішить проблеми зіставлення у вашому коді, і у вас не буде проблем із його використанням у майбутньому.
Брайан Варшоу,

1
Як би ви впоралися з оновленням схеми для вже розгорнутої бази даних SQL Server CE? Можна перенести це на окреме запитання, якщо це абсолютно не пов’язана процедура
FYK

35

Я виявив, що отримую ту саму помилку, оскільки забув створити посилальне обмеження після створення асоціації між двома сутностями.


13
FYI: Перевірте властивості асоціації, і внизу "Референційне обмеження" буде порожнім. Клацніть еліпсис і створіть обмеження.
Патріс Кальве

Це мені допомогло. Мені довелося створити відношення 1 .. * від моєї сутності походження до моєї суті навігації.
duyn9uyen

21

Помилка 3027: Не вказано відображення для наступного EntitySet / AssociationSet ... "- головні болі Entity Framework

Якщо ви розробляєте модель за допомогою Entities Framework, іноді може трапитися ця надокучлива помилка:

Помилка 3027: Не вказано відображення для наступного EntitySet / AssociationSet [Назва сутності або асоціації]

Це може не мати сенсу, коли в EDM все виглядає нормально, але це тому, що ця помилка зазвичай не має нічого спільного з EDM. Що слід сказати - це "відновлення файлів вашої бази даних".

Розумієте, Entities перевіряє SSDL та MSL під час збирання, тож якщо ви просто змінили EDM, але не використовуєте Модуль генерування бази даних ... тоді він скаржиться, що у ваших скриптах sql відсутні речі.

Отже, коротко кажучи, рішення полягає в тому, що "Не забудьте генерувати модель бази даних кожного разу після оновлення EDM, якщо ви вперше розробляєте модель. Сподіваюся, ваша проблема вирішена".


Це працювало за цією ж помилкою, коли модель Generate Database Model допомогла очистити виняток
kolexinfos

7

У моєму випадку інший розробник видалив деякі таблиці з базової бази даних. Коли я зрозумів це і видалив ці таблиці з сутності, проблема була вирішена. Це було не так очевидно, як це звучить.


6

Я зіткнувся з тією ж помилкою, але не використовував model-first. Виявилося, що якимось чином мій файл EDMX містив посилання на таблицю, хоча він і не відображався в конструкторі. Цікаво, що коли я здійснював текстовий пошук назви таблиці у Visual Studio (2013), таблиці не було знайдено.

Щоб вирішити проблему, я використав зовнішній редактор (Notepad ++), щоб знайти посилання на таблицю порушень у файлі EDMX, а потім (ретельно) видалив усі посилання на таблицю. Мені шкода сказати, що я не знаю, як файл EDMX перейшов у такий стан.


5

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

Видалення таблиці та повторне додавання її виправили.


Зауважте, що якщо TFS підключений, то зробіть реєстрацію edmx після видалення. Тоді і лише тоді отримуйте останню версію та повторно додайте її за певний двоетапний процес. В іншому випадку TFS плутається із видаленням та повторним додаванням тієї самої іменованої сутності, що, здається, спричиняє проблеми.


У мене була така ж проблема після зміни таблиці. Я знайшов ті самі сутності з числами 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. У файлі контексту .cs .
  5. видаліть усі рядки кодів, що посилаються на відсутні об'єкт. Вони будуть виглядати так:

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

Ця помилка є загальною для таблиць, видалених з бази даних.

web.config.connectionStringsПроблема полягає в тому, що хтось опускає таблицю в базу даних або просто змінює базу даних EF Mapped, щоб вказати нову, а не ту, яка використовується для генерації вихідних зіставлення.

Саме цієї нової бази даних цих об'єктів з помилкою 3027 немає.


0

У мене виникла помилка, коли я намагався зробити власний результат для збереженої процедури і припустив, що це повинна бути сутність.

Рішення полягало в тому, що я просто створив складний тип у браузері Model і призначив це в результаті "Редагувати імпорт функції".

Я додам його сюди, оскільки, схоже, це запитання - це те, куди Google бере вас, коли ви отримаєте цю помилку.


0

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


0

Модель оновлення з бази даних для мене не працює.

Мені довелося видалити конфліктну сутність, потім виконати Модель оновлення з бази даних, нарешті відновити рішення. Після цього все працює нормально.


0

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

Просто повторне додавання та надання доступу до мого користувача вирішили проблему.


0

Я думаю, що я отримав це через те, що явно не видаляв деякі таблиці з edmx перед перейменуванням та повторним додаванням їх. Натомість я просто перейменував таблиці, а потім зробив Модель оновлення з бази даних, думаючи, що вони побачать їх, і видалити їх із моделі. Потім я зробив ще одну модель оновлення з бази даних і додав перейменовані таблиці.

Сайт працював з новими таблицями, але у мене сталася помилка. Зрештою, я помітив, що оригінальні таблиці все ще були в моделі. Я видалив їх із моделі (натисніть їх на екрані edmx, клавішу видалення), і тоді помилка пішла.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.