Редактировать значение составного ключа с помощью LINQ - PullRequest
2 голосов
/ 19 января 2009

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

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

Я могу сделать это непосредственно в 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.

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

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

Ответы [ 5 ]

4 голосов
/ 19 января 2009

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

3 голосов
/ 20 января 2009

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

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

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

0 голосов
/ 19 января 2009

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

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

0 голосов
/ 19 января 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...