У него есть DefiningQuery, но нет элемента InsertFunction… err

123

Эта штука сводит меня с ума, и ошибка для меня совершенно бессмысленна:

Невозможно обновить EntitySet «TableB», потому что у него есть DefiningQuery и в элементе нет элемента, поддерживающего текущую операцию.

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

TableA
int idA (идентификатор, первичный ключ)
...

TableB
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. Удалите свойство store: Name

Я оставил ключ таким, каким он был, так как меня устраивало, что оба столбца являются частью ключа.

Palantir
источник
6
Спасибо за обновление - пошаговые инструкции помогли этому новичку EF заставить работать учебное приложение ASP.NET MVC!
Адам Нил,
Спасибо за это! У меня была проблема, что EF не сгенерировал правильный файл edmx для таблицы sql server 2000 с первичным ключом. Но эта инструкция меня спасла :)
100р
4
Спустя 3,5 года, и этот пост все еще помогает людям, в данном случае МЕНЯ! ... To: Palantir за пошаговое описание (сработало) и спасибо Алексу >>> Браво!
nanonerd 06
Решение сработало для меня .. Спасибо
Делавега
Секрет заключался в удалении "store:" из определения схемы. Очень красиво
Гильерме Феррейра

Ответы:

141

Когда таблица встречается без PrimaryKey, она рассматривается как View.

И представления отображаются в файле EDMX (откройте его в редакторе XML для просмотра) в элементе StorageModel \ EntitySet [n] \ DefiningQuery.

Когда у вас есть DefiningQuery, Entity становится доступным только для чтения, если вы не добавляете функции модификации. Вам нужны 3 функции модификации (также известные как хранимые процедуры), по одной для каждой из вставки, обновления и удаления.

Но у вас есть два варианта:

Измените ключевое определение:

  1. И убедить EF в том, что то, что он считает представлением, на самом деле является таблицей.
  2. Или добавьте соответствующие функции модификации

В вашем случае рекомендую (1).

Алекс Джеймс
источник
Я получил эту ошибку, когда пытался добавить объект в соединительную таблицу. Ваше предложение исправило это, спасибо!
Вальтер Стабош
Отлично ..., спасибо
Мохан Гундлапалли
Не забудьте нажать на «Обновить модель из базы данных» в вашем EDMX-файле, который вы сначала создали из базы данных
Башар Абу Шамаа
У меня такая же проблема, странная часть, он отлично работает в нашей локальной и тестовой среде, он просто не работает в клиентской среде (скучно)
Mox Shah
13

Просто добавьте в таблицу первичный ключ. Вот и все. Задача решена.

ALTER TABLE <TABLE_NAME>
ADD CONSTRAINT <CONSTRAINT_NAME> PRIMARY KEY(<COLUMN_NAME>)
Джебастин Дж.
источник
6

Мне не хватало первичного ключа в моей таблице, и я получил это сообщение об ошибке. Я заметил одну вещь: после того, как я добавил ключ в таблицу, мне нужно было очистить таблицу от edmx с помощью конструктора, сохранить edmx, а затем обновить его снова, чтобы снова добавить таблицу. Он не собирал ключ поскольку он уже был назначен как представление. Это не требовало редактирования edmx вручную.

mlapaglia
источник
5

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


источник
1

@Palantir. Убедитесь, что в обеих таблицах установлены первичные ключи, и будьте осторожны с несколькими первичными ключами, установленными в таблице.

Пауло 'PaulusHC' Гомеш
источник
0
  1. Вам необходимо вручную открыть файл .EDMX в блокноте или блокноте ++ или в любом текстовом редакторе по вашему выбору.
  2. Найдите запись в edmx: StorageModels в файле, открытом на шаге 1.
  3. Найдите элемент DefiningQuery и полностью удалите этот тег.
  4. Найдите магазин: от Schema = "dbo" до Schema = "dbo" (если вы пропустите этот шаг, будет сгенерирована ошибка недопустимого имени).
  5. Сохраните и закройте файл.

Надеюсь, это решит проблему.

Бриджеш Кумар Трипати
источник