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

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

17.01.2025, 22:42. Показов 3588. Ответов 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
 Аватар для Andrey-MSK
3317 / 2204 / 387
Регистрация: 14.08.2018
Сообщений: 7,411
Записей в блоге: 4
20.01.2025, 08:43
Цитата Сообщение от sijuiem Посмотреть сообщение
Образно говоря оператор внес информацию, сохранил ее, потом увидел, что ошибся в дате, пытается изменить дату, но ему предлагается удалить все что он ввел и внести информацию заново. Кто что делает в таком случае?
Эмммм... Для этого есть UPDATE - вот с ним всё решается оченно просто.
T-SQL
1
2
3
UPDATE MyTable
SET Field01 = N'Поле01', Field02 = N'20250120'
WHERE ID = @id -- ID нужной записи для редактирования.
0
0 / 0 / 0
Регистрация: 22.05.2017
Сообщений: 36
20.01.2025, 08:51  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Эмммм... Для этого есть UPDATE - вот с ним всё решается оченно просто.
Если бы все хотелось писать sql запросами, то в теме я бы не пометил EF NET. (
0
 Аватар для Andrey-MSK
3317 / 2204 / 387
Регистрация: 14.08.2018
Сообщений: 7,411
Записей в блоге: 4
20.01.2025, 09:09
Цитата Сообщение от sijuiem Посмотреть сообщение
то в теме я бы не пометил EF NET.
Я вам показал как это делается правильно с точки зрения сервера SQL. Первичный ключ никогда не меняется, он уникален на всей продолжительности жизни БД.
Переведите эту запись на EF - Основные операции с данными. CRUD.
0
0 / 0 / 0
Регистрация: 22.05.2017
Сообщений: 36
20.01.2025, 09:17  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Первичный ключ никогда не меняется, он уникален на всей продолжительности жизни БД.
Если бы все были согласны с тем, что первичные ключи должны быть неизменяемыми, то все СУБД запрещали бы обновление первичных ключей. Однако это не так.
0
 Аватар для Andrey-MSK
3317 / 2204 / 387
Регистрация: 14.08.2018
Сообщений: 7,411
Записей в блоге: 4
20.01.2025, 09:22
Цитата Сообщение от sijuiem Посмотреть сообщение
Однако это не так.
Как вы таблицу сделаете - так и будет. Вот так ID будет сам обновляться и никогда не повторится при удалении записей
T-SQL
1
2
3
4
5
6
7
8
9
CREATE TABLE [dbo].[tblEObject](
    [ID_EObject] [int] IDENTITY(1,1) NOT NULL, -- Автоматический ID
    [EObjectName] [nvarchar](200) NULL,
 CONSTRAINT [PK_tblEObject] PRIMARY KEY CLUSTERED 
(
    [ID_EObject] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
ID должен быть уникальным и назначаться сервером СУБД, никаких ручных правок для него делать не нужно, хотя возможность такая есть...
0
0 / 0 / 0
Регистрация: 22.05.2017
Сообщений: 36
20.01.2025, 09:29  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Как вы таблицу сделаете - так и будет. Вот так ID будет сам обновляться и никогда не повторится при удалении записей
Вопрос в том, что таблицы уже сделаны, сделаны давно. И да, это не MS SQL.
На ADO.NET с этим проблем вообще ноль.
Но вот EF NET подавай строго неизменяемый primary key. И это проблема.
0
 Аватар для Andrey-MSK
3317 / 2204 / 387
Регистрация: 14.08.2018
Сообщений: 7,411
Записей в блоге: 4
20.01.2025, 09:51
Цитата Сообщение от sijuiem Посмотреть сообщение
На ADO.NET с этим проблем вообще ноль.
Потому что ADO.NET работает с SQL напрямую.

Добавлено через 7 минут
Цитата Сообщение от sijuiem Посмотреть сообщение
и история ставок тарифов (ключ id, dstart)
Кто делает в первичном ключе изменяемое поле? Вот пример ключа сделки для ID 85
Code
1
2
85 20250117
85 20250118
Вы ошиблись, и для ID 85 было сделано 3 сделки 20250117 - и что в итоге? Как вы это запишите?
Кто мешал использовать обычный ID таблицы и связь 1-M?
0
0 / 0 / 0
Регистрация: 22.05.2017
Сообщений: 36
20.01.2025, 10:04  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Потому что ADO.NET работает с SQL напрямую.
А EF NET запросы формирует не напрямую для сервера СУБД? Суть в том что разработчики EF просто решили, что ключи отныне должны быть неизменяемыми. Не удивлюсь, если в будущем этот косяк будет исправлен. Пока же придется реализовывать костыли для обхода "новой реальности". )

Добавлено через 7 минут
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Вы ошиблись, и для ID 85 было сделано 3 сделки 20250117 - и что в итоге? Как вы это запишите?
Кто мешал использовать обычный ID таблицы и связь 1-M?
Это частный случай. Понятно что здесь ошибки в проектировании. Если вы будет хранить 20250117 в поле Datetime, то проблем не будет.

Я вам дам другой пример. Тариф ЖКХ и его история, когда не может быть два изменения ставки за один день.
Но при этом сама ставка могла начаться с одного дня, а потом внезапно оказалось что она должна начинаться с другого дня.
Конечно можно сделать искусственный ключ. Но это дополнительное поле раз и дополнительный индекс два. Зачем?
0
 Аватар для Andrey-MSK
3317 / 2204 / 387
Регистрация: 14.08.2018
Сообщений: 7,411
Записей в блоге: 4
20.01.2025, 10:07
Цитата Сообщение от sijuiem Посмотреть сообщение
Не удивлюсь, если в будущем этот косяк будет исправлен.
Не будет, так как это не косяк EF. Это косяк разработчика БД, не СУБД, а именно БД. К примеру в MS SQL Server можно руками править поле IDENTITY вот такой командой
T-SQL
1
IDENTITY OFF/ON
Но после этого о целостности данных можно забыть...

Добавлено через 57 секунд
Цитата Сообщение от sijuiem Посмотреть сообщение
Но при этом сама ставка могла начаться с одного дня, а потом внезапно оказалось что она должна начинаться с другого дня.
Вы не читаете?
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Кто мешал использовать обычный ID таблицы и связь 1-M?
0
0 / 0 / 0
Регистрация: 22.05.2017
Сообщений: 36
20.01.2025, 10:13  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Вы не читаете?
Дополнительное поле, дополнительный индекс.

Добавлено через 3 минуты
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Но после этого о целостности данных можно забыть...
Не совсем силен в MS SQL, но почему забыть? Отсутствуют каскадные обновления и удаления?
Или IDENTITY OFF отключает первичный ключ? И как часто Вы даете возможность пользователю сделать IDENTITY OFF?
0
 Аватар для Andrey-MSK
3317 / 2204 / 387
Регистрация: 14.08.2018
Сообщений: 7,411
Записей в блоге: 4
20.01.2025, 10:22
Цитата Сообщение от sijuiem Посмотреть сообщение
Или IDENTITY OFF отключает первичный ключ?
Отключает его автоматическую генерацию и поддержку уникальности.
Цитата Сообщение от sijuiem Посмотреть сообщение
Дополнительное поле, дополнительный индекс.
Code
1
2
3
4
5
6
7
Table01 ID, Fiedl01, Field02
Table02 ID, ID_Table01, Feld01, Field02
 
Table01.ID -> первичный ключ первой таблицы
Table02.ID -> первичный ключ второй таблицы
 
1-M -> Table01.ID = Table02.ID_Table01
Это стандартная практика связи таблиц, ничего тут лишнего нет и работает быстро, как и задумывалось.

Добавлено через 2 минуты
Цитата Сообщение от sijuiem Посмотреть сообщение
дополнительный индекс.
А это никак не влияет на БД, от слова совсем... Это даже будет лучше, так как анализатор запросов будет использовать дополнительные индексы для оптимизации плана запроса. Количество индексов на скорость работы никак не влияет. Можете их хоть 100 для таблицы сделать...
1
1721 / 1487 / 165
Регистрация: 25.07.2015
Сообщений: 2,584
20.01.2025, 10:22
Цитата Сообщение от sijuiem Посмотреть сообщение
но ему предлагается удалить все что он ввел и внести информацию заново. Кто что делает в таком случае?
Правильно предлагается. Все остальные варианты(костыли) ,с редактированием Primarykey тем более, от лукавого.
Цитата Сообщение от sijuiem Посмотреть сообщение
Дополнительное поле, дополнительный индекс.
И что ? У вас БД терабайтная , что лишний индекс ее положит в плане производительности?
0
 Аватар для Andrey-MSK
3317 / 2204 / 387
Регистрация: 14.08.2018
Сообщений: 7,411
Записей в блоге: 4
20.01.2025, 10:25
Цитата Сообщение от sijuiem Посмотреть сообщение
Отсутствуют каскадные обновления и удаления?
А вот про это нужно забыть как про страшный сон. В неумелых руках это бомба замедленного действия...
1
Эксперт .NET
 Аватар для Usaga
14103 / 9320 / 1349
Регистрация: 21.01.2016
Сообщений: 35,015
20.01.2025, 10:31
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
А вот про это нужно забыть как про страшный сон. В неумелых руках это бомба замедленного действия...
Я бы не сказал...
0
0 / 0 / 0
Регистрация: 22.05.2017
Сообщений: 36
20.01.2025, 10:33  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
А вот про это нужно забыть как про страшный сон. В неумелых руках это бомба замедленного действия...
Уже демагогия какая то пошла... Ладно от вас решений кроме, как перелопатить работающую базу для создания искусственных ключей я не вижу.

Добавлено через 2 минуты
Цитата Сообщение от Kulma Посмотреть сообщение
Правильно предлагается. Все остальные варианты(костыли) ,с редактированием Primarykey тем более, от лукавого.
Не вижу тут лукавого. У таблицы с редактируемым Primary Key НЕТ ДОЧЕРНИХ ТАБЛИЦ. В чем тут могут быть проблемы?
При это чать составного primary key относящаяся к родителю не редактируется.
0
 Аватар для Andrey-MSK
3317 / 2204 / 387
Регистрация: 14.08.2018
Сообщений: 7,411
Записей в блоге: 4
20.01.2025, 10:45
Цитата Сообщение от Usaga Посмотреть сообщение
Я бы не сказал...
Я ведь уточнил про неумелые руки

Добавлено через 1 минуту
Цитата Сообщение от sijuiem Посмотреть сообщение
Ладно от вас решений кроме, как перелопатить работающую базу для создания искусственных ключей я не вижу.
EF умеет напрямую работать с запросами SQL. Если вам так хочется, делайте... Но БД лучше перепроектировать...
0
1721 / 1487 / 165
Регистрация: 25.07.2015
Сообщений: 2,584
20.01.2025, 10:50
Цитата Сообщение от sijuiem Посмотреть сообщение
У таблицы с редактируемым Primary Key НЕТ ДОЧЕРНИХ ТАБЛИЦ. В чем тут могут быть проблемы?
Не имеет значения, есть дочерние таблицы или нет. Вы же эту таблицу не просто так создавали,
она наверняка участвует в какой-то логике
Идея целостности БД предполагает 1 ключ- 1 запись, для этого собственно и есть первичные ключи, как гарантия соблюдения вышесказанной концепции.
Когда вы отдаете заполнение этого ключа на откуп оператору/пользователю, то всегда существует вероятность
ошибки со всеми вытекающими.
И совершенно не обязательно ключ может быть продублирован , вероятность этого как раз практически нулевая,
учитывая уникальность ключевого поля, а вот ошибка ввода , например случайная смена раскладки клавиатуры,
вполне может быть.
1
0 / 0 / 0
Регистрация: 22.05.2017
Сообщений: 36
20.01.2025, 11:11  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Но БД лучше перепроектировать...
Скорее всего
0
1721 / 1487 / 165
Регистрация: 25.07.2015
Сообщений: 2,584
20.01.2025, 11:12
Цитата Сообщение от sijuiem Посмотреть сообщение
Уже демагогия какая то пошла...
Отнюдь.
Соглашусь с Andrey-MSK - это бомба замедленного действия.
Для небольших проектов наверное удобно , но эти процессы (каскадные удаления и обновления) должны
быть контролируемы разработчиком.
Вот представьте : есть некая компания , работающая с рядом поставщиков.
В один прекрасный момент кто-то из поставщиков прекращает сотрудничество и сливается,
а один сердобольный манагер решает удалить его запись из базы, дабы глаза не мозолил.
Только он не подумал, да и надо ли ему, что по поставщику есть какая-то
история- приходы/расходы/финансовые движения и т.д.
Догадываетесь , что произойдет при установленном дефолтно каскадном удалении и каким
"добрым словом" разраба вспомнит бухгалтерия, когда грохнется вся документальная история в базе,
привязанная к удаленной записи ?? ))
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.01.2025, 11:12
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru