Я использую Entity Framework 1 с .net 3.5.
Я делаю что-то простое, как это:
var roomDetails = context.Rooms.ToList();
foreach (var room in roomDetails)
{
room.LastUpdated = DateTime.Now;
}
Я получаю эту ошибку, когда я пытаюсь сделать:
context.SaveChanges();
Я получаю ошибку:
Невозможно обновить EntitySet - потому что у него есть DefiningQuery, а в элементе <ModificationFunctionMapping> отсутствует элемент <UpdateFunction> для поддержки текущей операции.
Я делаю много обновлений в контексте и не имею никаких проблем, это только когда я пытаюсь обновить эту конкретную сущность.
Все мои поиски обнаруживают одно и то же, что у сущности, которую я пытаюсь обновить, нет объявленного первичного ключа. Но, увы, у меня есть первичный ключ объявлен ...
Ответы:
Обычно это происходит по одной из следующих причин:
После этого вам, возможно, все же потребуется обновить в конструкторе Entity Framework (или, в качестве альтернативы, удалить сущность, а затем добавить ее), прежде чем прекратить получать ошибку.
источник
Просто добавьте первичный ключ к таблице. Вот и все. Задача решена.
источник
Это дело для меня. Простое удаление привело к другой ошибке. Я следовал за шагами этого поста, кроме последнего. Для вашего удобства я скопировал 4 шага из поста, который следовал, чтобы решить проблему следующим образом:
store:Schema="dbo"
вSchema="dbo"
( в противном случае код выдаст ошибку , сказав , что имя является недействительным)источник
Просто отметьте, что, возможно, у вашей сущности есть первичный ключ, но у вашей таблицы в базе данных нет первичного ключа .
источник
ОБНОВЛЕНИЕ: Я получил несколько голосов по этому поводу в последнее время, поэтому я решил, что я дам людям знать, что совет, который я даю ниже, не самый лучший. С тех пор как я начал заниматься созданием Entity Framework со старыми базами данных без ключей, я пришел к выводу, что лучшее, что вы можете сделать BY FAR, это сделать это с помощью обратного кода в первую очередь. Есть несколько хороших статей о том, как это сделать. Просто следуйте им, а затем, когда вы захотите добавить ключ, используйте аннотации данных, чтобы «подделать» ключ.
Например, скажем, я знаю, что моя таблица
Orders
, хотя она не имеет первичного ключа, гарантирует, что когда-либо будет только один номер заказа на одного клиента. Так как это первые два столбца в таблице, я бы настроил первые классы кода так:Делая это, вы в основном обманываете EF, полагая, что существует кластерный ключ, состоящий из OrderNumber и Customer. Это позволит вам делать вставки, обновления и т. Д. На вашем бесключевом столе.
Если вы не слишком знакомы с выполнением обратного Code First, найдите хорошее руководство по Entity Framework Code First. Затем найдите один из них в Reverse Code First (который выполняет Code First с существующей базой данных). Тогда просто возвращайся сюда и посмотри на мой ключевой совет снова. :)
Оригинальный ответ :
Первое: как уже говорили другие, лучший вариант - добавить первичный ключ в таблицу. Полная остановка. Если вы можете сделать это, не читайте дальше.
Но если вы не можете или просто ненавидите себя, есть способ сделать это без первичного ключа.
В моем случае я работал с устаревшей системой (изначально плоские файлы на AS400 портировались в Access, а затем портировались в T-SQL). Поэтому я должен был найти способ. Это моё решение. Следующее работает для меня, используя Entity Framework 6.0 (последний на NuGet на момент написания статьи).
Щелкните правой кнопкой мыши по файлу .edmx в обозревателе решений. Выберите «Открыть с помощью ...», а затем выберите «XML (Text) Editor». Мы собираемся вручную редактировать сгенерированный код здесь.
Посмотрите на строку, как это:
<EntitySet Name="table_name" EntityType="MyModel.Store.table_name" store:Type="Tables" store:Schema="dbo" store:Name="table_nane">
Снять
store:Name="table_name"
с конца.Изменить
store:Schema="whatever"
наSchema="whatever"
Посмотрите под этой строкой и найдите
<DefiningQuery>
тег. В нем будет большое старое утверждение. Удалите тег и его содержимое.Теперь ваша строка должна выглядеть примерно так:
<EntitySet Name="table_name" EntityType="MyModel.Store.table_name" store:Type="Tables" Schema="dbo" />
У нас есть что-то еще, чтобы изменить. Просмотрите ваш файл и найдите это:
<EntityType Name="table_name">
Рядом вы, вероятно, увидите некоторый закомментированный текст, предупреждающий вас о том, что у него не был идентифицирован первичный ключ, поэтому ключ выведен и определение является таблицей / представлением только для чтения. Вы можете оставить его или удалить его. Я удалил это.
Ниже
<Key>
тег. Это то, что Entity Framework будет использовать для вставки / обновления / удаления. ТАК УБЕДИТЕСЬ, ЧТО ВЫ ДЕЛАЕТЕ ЭТО ПРАВО. Свойство (или свойства) в этом теге должно указывать на уникально идентифицируемую строку. Например, скажем, я знаю, что моя таблицаorders
, хотя она не имеет первичного ключа, гарантирует, что когда-либо будет только один номер заказа на одного клиента.Так что мой выглядит так:
Серьезно, не делай этого неправильно. Допустим, что, хотя никогда не должно быть дубликатов, в мою систему попадают две строки с одинаковым номером заказа и именем клиента. Whooops! Вот что я получаю за то, что не использую ключ! Поэтому я использую Entity Framework, чтобы удалить один. Поскольку я знаю, что дубликат - единственный заказ на сегодня, я делаю это:
Угадай, что? Я просто удалил как дубликат, так и оригинал! Это потому, что я сказал Entity Framework, что order_number / cutomer_name был моим основным ключом. Поэтому, когда я сказал ему удалить duplicateOrder, то, что он делал в фоновом режиме, было что-то вроде:
И с этим предупреждением ... теперь тебе нужно идти!
источник
Это также может произойти, если модель данных устарела.
Надеюсь, это спасет кого-то еще от разочарования :)
источник
Я получал то же сообщение об ошибке, но в моем сценарии я пытался обновить сущности, полученные из отношения «многие ко многим», используя PJT (Pure Join Table).
Прочитав другие посты, я решил исправить это, добавив дополнительное поле PK в таблицу соединений ... Однако, если вы добавляете столбец PK в таблицу соединений, это больше не PJT, и вы теряете все преимущества структуры сущностей, такие как автоматическое сопоставление отношений между сущностями.
Таким образом, решение в моем случае состояло в том, чтобы изменить таблицу соединений в БД, чтобы сделать PK, включающий ОБА из столбцов внешних идентификаторов.
источник
может произойти ошибка, если ваша таблица не имеет первичного ключа, в этом случае таблица «только для чтения», а команда db.SaveChanges () всегда будет выдавать ошибку
источник
Установите Primary Key, затем сохраните Table и Refresh, затем перейдите в Model.edmx, удалите Table и получите снова.
источник
так что это правда, просто добавьте первичный ключ
Примечание: убедитесь, что когда вы обновляете свою диаграмму EF из базы данных, которую вы указываете на нужную базу данных, в моем случае строка подключения указывала на локальную БД, а не на современную БД разработчика, школьник ошибка, я знаю, но я хотел опубликовать это, потому что это может быть очень сложно, если вы уверены, что вы добавили первичный ключ, и вы все еще получаете ту же ошибку
источник
Я была такая же проблема. Как говорилось в этой ветке, в моей таблице не было PK, поэтому я установил PK и запустил код. Но, к сожалению, ошибка пришла снова. Затем я удалил соединение с БД (удалите файл .edmx в папке Model в обозревателе решений) и воссоздал его. Ошибка ушла после этого. Спасибо всем за то, что поделились своим опытом. Это сэкономит много времени.
источник
Я получил эту проблему, потому что я генерировал свой EDMX из существующей базы данных (разработанной кем-то другим, и здесь я свободно использую термин «разработан»).
Оказывается, на столе не было никаких ключей. EF генерировал модель со множеством ключей. Мне нужно было добавить первичный ключ в таблицу db в SQL, а затем обновил мою модель в VS.
Это исправило это для меня.
источник
Это не новый ответ, но поможет кому-то, кто не уверен, как установить первичный ключ для своей таблицы. Используйте это в новом запросе и запустите. Это установит столбец UniqueID в качестве первичного ключа.
источник
В моем случае забыли определить первичный ключ к таблице. Поэтому назначьте, как показано на рисунке, и обновите таблицу из «Обновить модель из базы данных» из файла .edmx. Надеюсь, это поможет!
источник
Добавление первичного ключа работало для меня тоже!
Как только это будет сделано, вот как обновить модель данных, не удаляя ее:
Щелкните правой кнопкой мыши на странице дизайнера сущностей edmx и выберите «Обновить модель из базы данных».
источник
У меня была точно такая же проблема, к сожалению, добавление первичного ключа не решает проблему. Итак, вот как я решаю свой:
primary key
таблица, чтобы я изменил свою таблицу и добавил первичный ключ.Delete the ADO.NET Entity Data Model
(файл EDMX), где я использую для сопоставления и подключения к моей базе данных.Add again a new file of ADO.NET Entity Data Model
для соединения с моей базой данных и для отображения свойств моей модели.Clean and rebuild the solution.
Задача решена.
источник
просто добавьте первичный ключ к вашей таблице, а затем воссоздайте свой EF
источник
Мне просто пришлось удалить таблицу из модели и снова обновить модель, вернув таблицу обратно. Я предполагаю, что первичный ключ был создан после того, как таблица была введена в модель.
источник
У меня возникла эта проблема, и я считаю, что она была вызвана тем, что я удалил первичный ключ индекса для моих таблиц и заменил его индексом для некоторых других полей в таблице.
После того как я удалил индекс первичного ключа и обновил edmx, вставки перестали работать.
Я обновил таблицу до более старой версии, обновил edmx, и все снова работает.
Я должен отметить, что когда я открыл EDMX, чтобы устранить эту проблему, проверил, был ли определен первичный ключ, был. Так что ни одно из вышеперечисленных предложений не помогло мне. Но обновление индекса по первичному ключу, похоже, сработало.
источник
Откройте файл .edmx в редакторе XML, а затем удалите тег из тега, а также измените store: Schema = "dbo" на Schema = "dbo" и перестройте решение, теперь ошибка устранится, и вы сможете сохранить данные.
источник
Я нашел оригинальный ответ обновления файла .edmx лучше всего в моей ситуации. Я просто не был рад изменению модели каждый раз, когда она обновлялась из базы данных. Вот почему я написал дополнительный файл текстового шаблона, который автоматически вызывается после изменения модели - точно так же, как объекты создаются заново. Я размещаю это здесь в этом комментарии. Чтобы это работало, убедитесь, что вы назвали его как {имя модели} .something.tt, и сохраните его в той же папке, что и ваша папка .edmx. Я назвал это {имя модели} .NonPkTables.tt. Он не создает файл сам по себе из-за неверного определения расширения файла во второй строке. Не стесняйтесь использовать.
источник
Я столкнулся с тем же сообщением об ошибке, чтобы вставить запись в таблицу, имеющую отношение « многие ко многим» . Моя схема базы данных была:
Таблица Student и Course имеют первичные ключи Id и Code соответственно , а таблица Student-Course имеет два внешних ключа, сопоставленных с таблицами Student и Course.
Логически схема правильная, но я допустил ошибку в базе данных, потому что у каждой таблицы должен быть первичный ключ.
Мое определение sql для Student-Course было:
Я сделал пару внешних ключей первичным ключом этой таблицы и обновил до:
Надеюсь, что это решит проблемы для некоторых парней.
источник