Редактировать значение составного ключа с помощью LINQ

У меня есть таблица, в которой в качестве составного ключа используются три столбца.

Одно из этих значений столбца используется в качестве средства отслеживания последовательности для упорядоченных связанных записей. Когда я вставляю новую запись, мне нужно увеличить порядковые номера для связанных записей, которые идут после новой записи.

Я могу сделать это непосредственно в SQL Server Management Studio, но когда я пытаюсь это сделать в LINQ, я получаю следующую ошибку:

Value of member 'Sequence' of an object of type 'TableName' changed.
A member defining the identity of the object cannot be changed.
Consider adding a new object with new identity and deleting the existing one instead.

Может ли кто-нибудь предложить способ обойти это ограничение?

(Добавление новой записи (как предлагается в сообщении об ошибке) на самом деле не вариант, поскольку таблица с составным ключом связана с другой таблицей.)

У меня была такая же проблема с унаследованной базой данных. Конечно, это плохой дизайн, но иногда мы получаем то, что нам дают. Я использовал решение ниже, создав новый ПК и реструктурируя БД. Странно то, что сама база данных обновляется нормально, подходит LINQ.

IanStallings 26.10.2009 23:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
5 261
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

В моей книге изменение первичных ключей - это «запах кода».

Конечно да. Однако LINQ-to-SQL, похоже, говорит нам, что это невозможно.

xofz 19.10.2010 06:11

Я считаю, что компилятор прав. Единственный способ сделать это - создать новую запись и удалить старую.

(Adding a new record (as suggested by the error message) isn't really an option as the table with the composite key has a relationship with another table.)

Думаю, с этим проблем нет. Просто скопируйте все поля вашего юридическое лицо, установите новый последовательность, а также установите любое отношение, просто назначив старую ссылку EntitySet новой. Я пробовал это, и он правильно обновляется.

Кроме того, не могли бы вы просто создать новый столбец идентификатора с автоинкрементом? Я согласен с @ocdecio. Я думаю, что изменение первичных ключей - плохой дизайн ...

Я не знаю LINQ, но будет ли это работать, если у вас есть каскадное обновление, определенное на SQL Server для отношений FK?

Помните, я думаю, что использование составного ключа - плохая идея, а изменение одного - худшая идея. Первичный ключ не должен меняться. Если изменить первичный ключ, слишком много вещей может выйти из строя. А что делать, когда первичный ключ меняется и теперь он не уникален? Если вы сделаете это, вам также понадобится способ справиться с этим, потому что это произойдет.

Ответ принят как подходящий

Исправление, которое мы реализовали, выглядело следующим образом

  • Удалена связь, в которой использовался составной ключ.
  • Добавлено поле идентификатора автоинкремента, сделав его первичным ключом.
  • Добавлено уникальное ограничение к трем полям, которые мы ранее использовали в качестве наших
  • Восстановил связь, используя три поля, которые ранее были нашим первичным ключом.

+1, но очень жаль, что это действительно единственный способ сделать это.

Peter Majeed 18.04.2012 18:08

Я работал над этим, используя хранимую процедуру SQL для обновления одного из первичных ключей и вызывая его из LINQ.

Другие вопросы по теме