Linq2SQL имеет дело со вставками / удалениями в таблице с уникальными ограничениями - PullRequest
5 голосов
/ 28 апреля 2009

У меня есть таблица, которая выглядит следующим образом:

TABLE Foo
{
  Guid Id [PK],
  int A [FK],
  int B [FK],
  int C [FK],
}

И уникальное ограничение для A, B и C.

Теперь, скажем, например, вы вставляете строку со свежим ПК с A = 1, B = 1, C = 1.

SubmitChanges(), все счастливы.

Теперь вы редактируете таблицу.

Вы удаляете предыдущую запись и вставляете строку с новым номером PK с A = 1, B = 1, C = 1.

SubmitChanges() БУМ! SQL-исключение ограничения уникального ключа.

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

Но что я могу с этим поделать? Было бы лучше сделать эти 3 поля составным ПК (и убрать старое) или это не сработает?

На данный момент «решением» является удаление уникальных ограничений из БД (но я не буду этого делать).

Ответы [ 2 ]

3 голосов
/ 28 апреля 2009

Один из вариантов - создать транзакцию (транзакцию, связанную с соединением, или TransactionScope) - удалить запись и SubmitChanges, добавить запись и SubmitChanges, а затем, наконец, зафиксировать транзакцию (или откат -бэк, если ты взорвался).

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

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

1 голос
/ 02 февраля 2010

У меня была такая же проблема. Закончилось написание класса-оболочки с коллекцией сущностей «Added» и «Deleted», которые я поддерживал. А также коллекция «Текущий». Пользовательский интерфейс был привязан к текущей коллекции.

Только когда я иду к сохранению, я вставляю InsertOnSubmit / DeleteOnSubmit и анализирую 2 коллекции, чтобы решить, с какими объектами делать, с чем.

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