Він має DefiningQuery, але немає елемента InsertFunction ... помилка


123

Ця річ зводить мене з розуму, і помилка для мене цілком безглузда:

Неможливо оновити EntitySet 'TableB', оскільки в ньому є DefiningQuery і в елементі немає елемента, який би підтримував поточну операцію.

Мої таблиці розміщені так:

ТаблицяА
int idA (ідентифікація, первинний ключ)
...

ТаблицяB
int idA (FK для TableA.idA)
int val

TableB не має визначеного первинного ключа на SQL-сервері. Entity Framework імпортував таблицю та асоціацію та встановив обидва поля як ключові. Але ця помилка виведе, коли я спробую зробити вставку в таблицю!

Що не так??


Редагувати: Як запропонував Алекс, рішення було таким:

  1. Клацніть правою кнопкою миші на файл edmx, виберіть Відкрити за допомогою, редактор XML
  2. Знайдіть об'єкт у елементі edmx: StorageModels
  3. Видаліть DefiningQuery повністю
  4. Перейменуйте магазин: Schema = "dbo" у Schema = "dbo" (інакше код створить помилку, кажучи, що ім'я недійсне)
  5. Видаліть магазин: Властивість імені

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


6
Дякуємо за оновлення - покрокові інструкції допомогли цьому новонародженому EF налагодити роботу програми ASP.NET MVC!
Адам Ніл

Thnx для цього! У мене виникла проблема, що EF не генерував належний файл edmx для таблиці sql-сервера 2000, який має первинний ключ. Але ця інструкція врятувала мене :)
100р

4
Через 3,5 роки, і цей пост все ще допомагає ppl, в цьому випадку МЕН! ... До: Палантір за описовий крок за кроком (він працював) і дякую Алексу >>> Браво!
nanonerd

Рішення працювало для мене .. Спасибі
Делавега

Секрет полягав у видаленні "store:" з визначення схеми. Дуже приємно
Гільгерме Феррейра

Відповіді:


141

Добре, коли таблиця зустрічається без PrimaryKey, вона трактується як Вид.

І перегляди відображаються у файлі EDMX (відкрийте його в XML-редакторі, щоб побачити) в елементі StorageModel \ EntitySet [n] \ DefiningQuery.

Коли у вас є DefiningQuery, Entity стає лише для читання, якщо ви не додаєте функції модифікації. Вам потрібні 3 функції модифікації (відомі також як "Збережені процедури") по одній для кожної "Вставки, оновлення та видалення".

Але у вас є два варіанти:

Змінення ключового визначення:

  1. І переконати ЕФ, що те, що він вважає, - це дійсно таблиця
  2. Або додайте відповідні функції модифікації

У вашому випадку рекомендую (1).


Я отримав цю помилку, коли я намагався додати об'єкт до таблиці з’єднання. Ваша пропозиція виправила це, дякую!
Вальтер Стабош

це чудово ..., Tnks
Mohan Gundlapalli

Не забудьте натиснути «Оновити модель з бази даних» на вашому файлі .edmx, який ви спершу створили з бази даних
Башар Абу Шамаа

Я зіткнувся з тим же питанням, дивна частина полягає в тому, що він працює чудово в нашому локальному і тестовому середовищі, він просто не працює на середовищі клієнта (нудно)
Mox Shah

13

Просто додайте первинний ключ до таблиці. Це воно. Проблема вирішена.

ALTER TABLE <TABLE_NAME>
ADD CONSTRAINT <CONSTRAINT_NAME> PRIMARY KEY(<COLUMN_NAME>)

6

У мене не було первинного ключа на моєму столі, і я отримав це повідомлення про помилку. Одне, що я зазначив, було після того, як я додав ключ до таблиці, мені потрібно було очистити таблицю від edmx за допомогою конструктора, зберегти edmx, а потім оновити її знову, щоб додати таблицю назад. Це не було підбирання ключа оскільки воно вже було призначене як вид. Для цього не потрібно було редагувати edmx вручну.


5

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


1

@Palantir. Переконайтесь, що для обох таблиць встановлено первинні ключі, і будьте обережні, якщо в таблиці встановлено кілька первинних ключів.


0
  1. Вам потрібно вручну відкрити .EDMX файл у блокноті чи блокноті ++ або в будь-якому текстовому редакторі на ваш вибір.
  2. Знайдіть запис у edmx: StorageModels у файлі, відкритому на етапі1.
  3. Знайдіть елемент DefiningQuery і повністю видаліть цей тег.
  4. Знайдіть магазин: Schema = "dbo" до Schema = "dbo" (якщо пропустити цей крок, це призведе до помилки імені недійсного).
  5. Збережіть і закрийте файл.

Сподіваюся, це вирішить проблему.

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