Как обновить поле основного ключа с помощью linq to SQL? - PullRequest
3 голосов
/ 09 мая 2011

У меня есть tbl_names со следующими полями:

Id  int
Name nvarchar(10)
family nvarchar(20)


Id    Name    Family
 1     John     Smith

и, предположим, Id и name являются первичным ключом (составной первичный ключ).и я хочу обновить поле name в соответствии со значением поля Id.

DataclassesContext dac=new DataClassesContext();
var query=from record in Dac.tbl_name where record.id=1 select record;
query.name="Raymond";
Dac.Submitchanges();

, но я обнаружил следующую ошибку:

Value of member 'co_Workshop' of an object of type 'Tbl_Workshop' 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.

Это из-за nameполе является первичным ключом?почему я не могу обновить поле первичного ключа с помощью linq?

Ответы [ 4 ]

4 голосов
/ 09 мая 2011

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

В вашем случае вам нужно удалить и заново создать PK, чтобы он был просто полем «Id», а затем, если вам нужно улучшить производительностьпри фильтрации запросов по «имени» просто добавьте индекс в поле «имя».Тот факт, что вы используете только поле «Id», чтобы найти запись, подтверждает эту идею.

РЕДАКТИРОВАТЬ: Я ответил до того, как были комментарии к Вопросу.Теперь, когда я вижу комментарий от OP о том, что «это старая база данных, и она не может изменить ее структуру», я бы сказал, что если нет FK, указывающих на этот PK, то это должно быть довольно прямое изменение (удалите и воссоздайте PK только с полем "Id", как я упоминал выше).Если являются FK, указывающими на него, то вариант (хотя и не лучший вариант, и он может не работать на всех СУБД):

  1. Отбросить FK
  2. Удалите PK
  3. Создайте новый PK только в поле "Id"
  4. Создайте УНИКАЛЬНЫЙ ИНДЕКС для "Id" и "Name"
  5. Воссоздайте FK вуказать на УНИКАЛЬНЫЙ ИНДЕКС

Это будет работать на Microsoft SQL Server, и, хотя мне не нравится идея FK, указывающего на УНИКАЛЬНЫЙ ИНДЕКС, она должна учитывать ту же структуру, что и сейчас плюс LINQ просто увидит одно поле PK на «Id» и разрешит обновление.

1 голос
/ 17 октября 2014

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

0 голосов
/ 26 августа 2015

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

Простое решение состояло в том, чтобы не использовать Linq в этом случае, а использовать T_SQL и выполнить простое обновление.

update tbl_name set name = 'Raymond' where id = 1
0 голосов
/ 09 мая 2011

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

http://social.msdn.microsoft.com/Forums/en/linqprojectgeneral/thread/64064c2d-1484-4a00-a2c4-764bcb6b774a

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