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

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

17.01.2025, 22:42. Показов 4662. Ответов 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
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,703
Записей в блоге: 4
20.01.2025, 11:22
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от sijuiem Посмотреть сообщение
И как часто Вы даете возможность пользователю сделать IDENTITY OFF?
Никогда. Эта возможность только для администратора и используется очень редко в технических целях при обслуживании БД.
0
0 / 0 / 0
Регистрация: 22.05.2017
Сообщений: 37
20.01.2025, 11:29  [ТС]
Цитата Сообщение от Kulma Посмотреть сообщение
Не имеет значения, есть дочерние таблицы или нет. Вы же эту таблицу не просто так создавали,
она наверняка участвует в какой-то логике
Логика сводится лишь к тому чтобы не было двух записей по одному родителю за определенную дату. И все.
Я же уже написал, что логика таблицы хранить историю определенных показателей.
В этом контексте изменение пользователем части первичного ключа вполне допустимо.
От того что я сделаю искусственный ключ, а текущий примари вынесу в просто уникальный ничего не поменяется. Пользователь также не сможет внести внести два одинаковых значения составного ключа.
Суть в том, что удалив запись и создав ее заново - так можно, а просто изменить часть ключа - так нельзя. Но по факту результат получается одним и тем же.

Добавлено через 2 минуты
Цитата Сообщение от Kulma Посмотреть сообщение
В один прекрасный момент кто-то из поставщиков прекращает сотрудничество и сливается,
а один сердобольный манагер решает удалить его запись из базы, дабы глаза не мозолил.
Только он не подумал, да и надо ли ему, что по поставщику есть какая-то
история- приходы/расходы/финансовые движения и т.д.
Запрет каскадных удалений в базе и нет проблемы.

Добавлено через 57 секунд
Цитата Сообщение от Kulma Посмотреть сообщение
Догадываетесь , что произойдет при установленном дефолтно каскадном удалении и каким
А что есть такие СУБД где каскадное удаление по умолчанию разрешено?
0
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,703
Записей в блоге: 4
20.01.2025, 11:36
Цитата Сообщение от sijuiem Посмотреть сообщение
А что есть такие СУБД где каскадное удаление по умолчанию разрешено?
Нет, но возможность очень соблазнительная, да вы и сами про неё упомянули...
0
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,703
Записей в блоге: 4
20.01.2025, 11:42
Цитата Сообщение от sijuiem Посмотреть сообщение
От того что я сделаю искусственный ключ, а текущий примари вынесу в просто уникальный ничего не поменяется. Пользователь также не сможет внести внести два одинаковых значения составного ключа.
Сделайте из этих полей отдельный уникальный индекс, а первичным сделайте ID, и проблема будет решена...
0
 Аватар для IamRain
4695 / 2702 / 735
Регистрация: 02.08.2011
Сообщений: 7,236
20.01.2025, 11:45
sijuiem, удалите старую запись и создайте новую с нужными значениями ключа. Делов то.

Добавлено через 1 минуту
Цитата Сообщение от sijuiem Посмотреть сообщение
В этом контексте изменение пользователем части первичного ключа вполне допустимо.
В контексте СУБД Primary Key - это уникальный идентификатор, который позволяет быстро "зацепиться" за нужную запись.
Поэтому изменение идентификатора нежелательно. Паспорт вы тоже раз в месяц меняете? - аналогия.
0
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,703
Записей в блоге: 4
20.01.2025, 11:46
Цитата Сообщение от IamRain Посмотреть сообщение
Делов то.
Тут сам смысл в неправильном проектировании БД, с использованием изменяемых полей в первичном индексе...
0
0 / 0 / 0
Регистрация: 22.05.2017
Сообщений: 37
20.01.2025, 11:55  [ТС]
Цитата Сообщение от IamRain Посмотреть сообщение
В контексте СУБД Primary Key - это уникальный идентификатор, который позволяет быстро "зацепиться" за нужную запись.
Поэтому изменение идентификатора нежелательно. Паспорт вы тоже раз в месяц меняете? - аналогия.
Сравнить паспорт, с изменением даты в записи, например, хронологии показаний прибора учета. Да вы гений аналогий? ))
0
 Аватар для IamRain
4695 / 2702 / 735
Регистрация: 02.08.2011
Сообщений: 7,236
20.01.2025, 11:59
Цитата Сообщение от sijuiem Посмотреть сообщение
Сравнить паспорт, с изменением даты в записи, например, хронологии показаний прибора учета.
Если дата в записи - часть PK, это очень точная аналогия. А лепить БД через *опу - создавать себе ненужные проблемы. Вам заняться больше нечем? - на вопрос дали ответ, удалите и создайте по новой.
Любите секас сидя - занимайтесь
0
0 / 0 / 0
Регистрация: 22.05.2017
Сообщений: 37
20.01.2025, 12:10  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Сделайте из этих полей отдельный уникальный индекс, а первичным сделайте ID, и проблема будет решена...
На работающих уже базах скорее всего не вариант.
Малой кровью - это невидимое удаление и вставка копии удаленной записи.

Добавлено через 3 минуты
Цитата Сообщение от IamRain Посмотреть сообщение
А лепить БД через *опу - создавать себе ненужные проблемы.
Слеплено, то что работает уже 15 лет. Это ли не показатель, что слеплено по факту то неплохо?
0
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,703
Записей в блоге: 4
20.01.2025, 12:15
Цитата Сообщение от sijuiem Посмотреть сообщение
На работающих уже базах скорее всего не вариант.
Чего это вдруг? Запросом делается копия исходной таблицы, создаётся новая с нужной структурой, переносятся данные в неё из исходной, старая удаляется, новая переименовывается.

Добавлено через 4 минуты
sijuiem, Вот один из примеров как меняется структура таблицы на рабочей БД
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.tblTest_001 ADD
    NewName nvarchar(50) NULL
GO
ALTER TABLE dbo.tblTest_001 SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
0
 Аватар для IamRain
4695 / 2702 / 735
Регистрация: 02.08.2011
Сообщений: 7,236
20.01.2025, 12:24
Цитата Сообщение от sijuiem Посмотреть сообщение
Это ли не показатель, что слеплено по факту то неплохо?
Нет, конечно. Возраст - никогда не показатель. Это как говорить, что разработчик с опытом в 20 лет, в 2 раза лучше разработчика с опытом в 10 лет, или это 10x к разработчику с опытом в 2 года. На деле, неизвестно, что там осталось от разработчика, может ничего и не осталось уже.

EF вам не дураки писали, есть свои ограничения, конечно, но все делается по канонам.
0
0 / 0 / 0
Регистрация: 22.05.2017
Сообщений: 37
20.01.2025, 12:51  [ТС]
Цитата Сообщение от IamRain Посмотреть сообщение
Нет, конечно. Возраст - никогда не показатель. Это как говорить, что разработчик с опытом в 20 лет, в 2 раза лучше разработчика с опытом в 10 лет, или это 10x к разработчику с опытом в 2 года
Можно без тупых аналогий?
0
 Аватар для IamRain
4695 / 2702 / 735
Регистрация: 02.08.2011
Сообщений: 7,236
20.01.2025, 12:57
Цитата Сообщение от sijuiem Посмотреть сообщение
Можно без тупых аналогий?
Ответ на вопрос вам уже дали, зачем вы продолжаете беседу?

Добавлено через 1 минуту
Цитата Сообщение от sijuiem Посмотреть сообщение
то что работает уже 15 лет. Это ли не показатель, что слеплено по факту то неплохо?
Как раз-таки напротив, возраст может говорить о том, что это сраное легаси, закостенелое (аля "работает - не трогай") во многих местах.
С большим количеством техдолга. Намеки на это мы уже увидели.
0
0 / 0 / 0
Регистрация: 22.05.2017
Сообщений: 37
20.01.2025, 13:01  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Вот один из примеров как меняется структура таблицы на рабочей БД
А для Firebird можно?
0
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,703
Записей в блоге: 4
20.01.2025, 13:13
Цитата Сообщение от sijuiem Посмотреть сообщение
А для Firebird или MySQL можно?
Язык SQL одинаковый для всех СУБД, различия лишь в наворотах самой СУБД, её внутренних функциях и переменных состояния.
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Запросом делается копия исходной таблицы, создаётся новая с нужной структурой, переносятся данные в неё из исходной, старая удаляется, новая переименовывается.
Забыл написать. Это всё делается в рамках одной транзакции, чтобы в случае чего вернуть БД в нормальное состояние. И в режиме БД ReadOnly, а ещё лучше в монопольном, если последнее - то всех активных пользователей отключит, БД перейдёт в монопольный режим, вы запустите запрос, он всё сделает, и потом включаете нормальный режим работы БД. Пользователи даже не поймут что произошло, так как для них всё как работало, так и будет работать с новой версией.

Добавлено через 1 минуту
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
вы запустите запрос
Его конечно нужно будет оттестировать на тестовом сервере, перед запуском на боевом.
0
Эксперт .NET
 Аватар для Usaga
14733 / 9507 / 1363
Регистрация: 21.01.2016
Сообщений: 35,869
24.01.2025, 08:40
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Язык SQL одинаковый для всех СУБД, различия лишь в наворотах самой СУБД, её внутренних функциях и переменных состояния.
Язык один, но диалекты разные.
0
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,703
Записей в блоге: 4
24.01.2025, 08:43
Цитата Сообщение от Usaga Посмотреть сообщение
Язык один, но диалекты разные.
Ну как бы я об этом и сказал
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
различия лишь в наворотах самой СУБД, её внутренних функциях и переменных состояния.
0
Эксперт .NET
 Аватар для Usaga
14733 / 9507 / 1363
Регистрация: 21.01.2016
Сообщений: 35,869
24.01.2025, 09:07
Andrey-MSK, диалект это не наворот. Это диалект. Похожее, но не точно написание одного и того же.
1
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
24.01.2025, 09:57

Не по теме:

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Первичный ключ никогда не меняется, он уникален на всей продолжительности жизни БД.
Технически это можно провернуть. Правда до такого рекомендуется не доводить, потому как за программистом тут же выезжают дементоры из Азкабана. XD

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
А вот про это нужно забыть как про страшный сон. В неумелых руках это бомба замедленного действия...
+1

Навыгребал из-за них кучу проблем. Самая элементарная: БД разростается, всё скинули на каскадное удаление. Через некоторое время прилетает баг "удаление занимает дофига времени", ещё через время уже прилетает критикал "удаление падает с таймаутом". Отдельный челендж, когда это удаление критично и нельзя просто пометить "удалено" и забить.

Проблема номер два: ты не чекаешь что удаляешь. Т.е. удалил запись ТаблицаА, а там потянулу записи из ТаблицыВ, которые нельзя удалять (например не хватает прав). Как ты про это узнаешь? Правильно, когда прилетит внеочередной баг от QA месяца так через три-четыре.



Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Чего это вдруг? Запросом делается копия исходной таблицы, создаётся новая с нужной структурой, переносятся данные в неё из исходной, старая удаляется, новая переименовывается.
Старую рекомендую удалить через месяц-другой. На всякий пусть поваляется рядом некоторое время.

Цитата Сообщение от sijuiem Посмотреть сообщение
Логика сводится лишь к тому чтобы не было двух записей по одному родителю за определенную дату. И все.
Я же уже написал, что логика таблицы хранить историю определенных показателей.
Довольно странная организация... можно для самый глупеньких:
- какие таблицы, прям скрипт создания (не обязательно полный, только ключевые моменты)
- краткое описание что храниться в таблице и зачем
- краткое описание что вы хотите выполнить (я так понимаю поменять запись в истории?)

Потому как "история" и "один-к-одному" у меня в голове не складываются. Обычно есть таблица с элементами, и таблица истории изменений, которая ссылается на таблицу элементов "один-ко-многим". Причем за правило береться что ЛЮБОЕ изменение порождает новую запись в таблице истории, вне зависимости от того правили критичную инфу или не очень.

Поэтому либо не правильно организовано, либо не понял задум.
0
0 / 0 / 0
Регистрация: 22.05.2017
Сообщений: 37
28.01.2025, 14:01  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
Довольно странная организация... можно для самый глупеньких:
- какие таблицы, прям скрипт создания (не обязательно полный, только ключевые моменты)
- краткое описание что храниться в таблице и зачем
- краткое описание что вы хотите выполнить (я так понимаю поменять запись в истории?)
Простейший вариант тариф и его история.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class TARIFF
{
    [Key]
    public int ID_TARIFF { get; set; }
    [Required]
    public string NAME { get; set; }
  
    [InverseProperty("ID_TARIFFNavigation")]
    public virtual ICollection<TARIFFDETAIL> TARIFFDETAIL { get; set; } = new List<TARIFFDETAIL>();
}
 
 
 
class TARIFFDETAIL
{
    [Key]
    public int ID_TARIFF { get; set; }
 
    [Key]
    [Column(TypeName = "DATE")]
    public DateTime DSTART { get; set; }
 
    [Column(TypeName = "DECIMAL(15,2)")]
    public decimal RATE { get; set; }
 
    [ForeignKey("ID_TARIFF")]
 
    [InverseProperty("TARIFFDETAIL")]
    public virtual TARIFF ID_TARIFFNavigation { get; set; }
}
Тариф и его история.
Пользователь при вводе новой записи в историю тарифа (в таблицу TARIFFDETAIL) ошибается с датой и сохраняет запись. Затем хочет исправить ее на правильную дату.

В ADO NET - пожалуйста - нет проблем.

В EF NET Core - ошибка. Сначала удали, а затем введи заново.

Конечно можно сделать искусственный ключ для TARIFFDETAIL и ограничение на уникальность для связки ID_TARIFF,DSTART, но что это дает физически, кроме лишнего поля и еще одного индекса?

А еще при этом нельзя будет сделать лаконичный Context.TARIFFDETAIL.Find(ID_TARIFF,DSTA RT)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.01.2025, 14:01

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru