Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 22.05.2017
Сообщений: 37

DB контекст не формирует запрос на обновление первичного ключа

17.01.2025, 22:42. Показов 5086. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При попытке сохранения изменений значения первичного ключа ошибка. (EF NET 8)

The property 'ТАБЛИЦА.ПОЛЕ_В_ПЕРВИЧНОМ_КЛЮЧЕ' is part of a key and so cannot be modified or marked as modified. To change the principal of an existing entity with an identifying foreign key, first delete the dependent and invoke 'SaveChanges', and then associate the dependent with the new principal.

Например, есть таблица тарифов (ключ - id) и история ставок тарифов (ключ id, dstart) . У истории ставок нет дочерних таблиц. При редактировании в таблице истории ставок существующей записи поля dstart (часть первичного ключа) и сохранении в SaveChanges выходит выше указанное предложение. Как то глупо получается. Надо удалить запись и ввести новую с новой датой. Образно говоря оператор внес информацию, сохранил ее, потом увидел, что ошибся в дате, пытается изменить дату, но ему предлагается удалить все что он ввел и внести информацию заново. Кто что делает в таком случае?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.01.2025, 22:42
Ответы с готовыми решениями:

Обновление таблицы с сохранением первичного ключа
Здравствуйте форумчане! Вопрос. Имеется форма, в которой содержатся данные клиентах, дате добавления, сумме покупке, и т.д. и т.п. ...

Обновление первичного ключа через хранимую процедуру
Пишу клиент - серверное приложение: Delphi + Firebird. Для взаимодействия с БД написал несколько хранимых процедур. create or alter...

Обновление первичного ключа после выполнения запроса
У меня в классе есть такой метод: public void Delete(int id) { using (SqlCeConnection cn = new...

41
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
28.01.2025, 15:41
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от sijuiem Посмотреть сообщение
В EF NET Core - ошибка. Сначала удали, а затем введи заново.
EF считает что у вас составной ключ ID_TARIFF + DSTART. Если у вас подход DBFirst, и при этом классы пишете вручную, то скорее всего в БД поле DSTART не является частью составного PK, поэтому ADO.NET и работает. А вот EF уже отслеживает логичность такого действия, и считает что вы пытаетесь перезаписать PK. Ещё занятный момент если верить документации, то для неотслеживаемого элемента может вызываться тупо update в которому будут искать по условию where ID_TARIFF= @id and DATE=@date

Если свойство ключа имеет свое значение, созданное базой данных, и значение, отличное от по умолчанию, указывается при добавлении сущности, EF предполагает, что сущность уже существует в базе данных и попытается обновить ее вместо вставки нового.
В общем выглядит как та ещё бомба... По идеи вам нужно что-то такое
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class TARIFFDETAIL
{
    [Key]
    public int ID_TARIFFDETAIL { get; set; }
 
    [Required]
    [Column(TypeName = "DATE")]
    public DateTime DSTART { get; set; }
 
    [Column(TypeName = "DECIMAL(15,2)")]
    public decimal RATE { get; set; }
 
    [Required] 
    public int ID_TARIFF { get; set; }
 
    [ForeignKey("ID_TARIFF")]
    [InverseProperty("TARIFFDETAIL")]
    public virtual TARIFF ID_TARIFFNavigation { get; set; }
}
ID_TARIFFDETAIL становится PK для исторической записи, при этом вы можете в этой записи поменять всё что душе угодно. Где-то придется добавить проверку на уникальность ID_TARIFF,DSTART, и скорее всего ещё и индексы. Тут не подскажу, знаю только как из БД это провернуть.

Цитата Сообщение от sijuiem Посмотреть сообщение
Context.TARIFFDETAIL.Find(ID_TARIFF,DSTA RT)
C#
1
Context.TARIFFDETAIL.First(x => x.ID_TARIFF == idTariff && x.DSTART == dStart);
Но учитывая что тут нужно добавить автогенерируемый ключ, возможно будете против такого решения. Как извернуться с вашей текущей моделью -- без понятия.
0
0 / 0 / 0
Регистрация: 22.05.2017
Сообщений: 37
28.01.2025, 17:19  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
Если у вас подход DBFirst, и при этом классы пишете вручную, то скорее всего в БД поле DSTART не является частью составного PK, поэтому ADO.NET и работает.
ADO.NET модель сформирована автоматически из базы. Руками ничего не делалось, и все составные ключи правильно отразились в модели. И правильно сформированы апдейт и делит запросы. update ... where id_tariff=@id_tariff and dstart=@dstart
Цитата Сообщение от Wolfdp Посмотреть сообщение
По идеи вам нужно что-то такое
Да. только еще добавить уникальность CONSTRAINT XXXXX UNIQUE (ID_TARIFF, DSTART)

Уже планирую подобные изменения. Благо что такие таблицы у меня в конце иерархии и добавление искусственного ключа не приведет к катастрофе и можно обойтись, в принципе, малой кровью.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.01.2025, 17:19

Запрос на создание таблицы. Установка первичного ключа.
Доброго времени суток. Ситуация следующая: у меня есть запрос на создание таблицы. Мне нужно в создаваемой таблице установить...

Как выглядит SQL запрос на получение первичного ключа с таблицы
Подскажите пожалуйста,как выглядит SQL запрос на получение первичного ключа таблицы c SQL Server

Тип сущности требует определения первичного ключа, но ключа в бд нет
Здравствуйте, делаю сайт и столкнулась с рядом трудностей, которых в прошлых раз не было. Во-первых, не работает Scaffold-DbContext,...

Получение первичного ключа
Не могу найти решения следующего вопроса. У меня имеется таблица, где id является инкрементом и первичным ключом. В следующей строке: ...

Автоинкремент первичного ключа
Здравствуйте! Не получается записывать данные в БД из-за того, что первичный ключ не должен повторяться. Подскажите, как сделать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
42
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru