LinqToSQL: невозможно обновить PrimaryKey? - PullRequest
0 голосов
/ 24 марта 2010

У меня есть простая таблица (назовем ее Table1), в которой в качестве PK используется поле NVARCHAR. Таблица 1 не связана с другими таблицами.

Когда я обновляю столбец PK таблицы Table1 с помощью LinqToSQL, происходит сбой. Если я обновлю другой столбец, это будет успешно.

Я мог бы удалить эту строку и вставить новую в Таблицу1, но я не хочу. Существует таблица транзакций, в которой столбец PK таблицы Table1 является столбцом.

Когда PK таблицы Table1 изменяется, я не хочу никакого эффекта в таблице транзакций. Но когда строка из Table1 удаляется, я хочу, чтобы строки транзакции были удалены. Каскадирование осуществляется через триггер.

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

По этой причине я не могу удалить, а затем добавить новую строку в Таблицу1. Итак, что можно сделать для успешного обновления PrimaryKey таблицы Table1?

Ответы [ 2 ]

3 голосов
/ 24 марта 2010

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

Обновление:

Также обратите внимание, что когда вы используете этот столбец в качестве первичного ключа и связываете его с другими таблицами, вы больше не можете его изменить. SQL Server выдаст ошибку UPDATE statement conflicted with COLUMN REFERENCE constraint в ваше лицо.

Далее есть другие проблемы с изменением первичного ключа, например: производительность. Изменение первичного ключа приведет к фрагментации кластерного индекса.

2 голосов
/ 24 марта 2010

Первичный ключ строки предназначен для уникальной идентификации строки (в случае LINQ to SQL, объекта).

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

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

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