У меня есть таблица, в которой в качестве составного ключа используются три столбца.
Одно из этих значений столбца используется в качестве средства отслеживания последовательности для упорядоченных связанных записей. Когда я вставляю новую запись, мне нужно увеличить порядковые номера для связанных записей, которые идут после новой записи.
Я могу сделать это непосредственно в 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-to-SQL, похоже, говорит нам, что это невозможно.
Я считаю, что компилятор прав. Единственный способ сделать это - создать новую запись и удалить старую.
(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, но очень жаль, что это действительно единственный способ сделать это.
Я работал над этим, используя хранимую процедуру SQL для обновления одного из первичных ключей и вызывая его из LINQ.
У меня была такая же проблема с унаследованной базой данных. Конечно, это плохой дизайн, но иногда мы получаем то, что нам дают. Я использовал решение ниже, создав новый ПК и реструктурируя БД. Странно то, что сама база данных обновляется нормально, подходит LINQ.