Linq-to-sql Ошибка при удалении новой дочерней записи перед отправкой - PullRequest
0 голосов
/ 28 ноября 2011

У меня есть 2 таблицы с отношением мастер-деталь. Мы используем DataGridView для обработки подробных записей. Подробные записи имеют поля со значениями поиска (внешние ключи). Вместо установки значения идентификатора для справочных таблиц мы устанавливаем значение объекта. Это все работает хорошо, а не одна ситуация. Если мы добавим строку сведений и зададим хотя бы одно из полей поиска и удалим эту строку перед сохранением (submitchanges), мы получим эту ошибку:

Была предпринята попытка удалить связь между TableX и TableY. Однако один из внешних ключей отношения (TableY.TableXID) не может быть установлен равным нулю.

Эта проблема обсуждалась в этом вопросе (прокрутите вниз, чтобы ответить на Нейла Барнвелла), но у нее нет ответа на эту конкретную проблему. Решение «Вызов Datacontext.GetChanges» не помогает, так как Datacontext не предоставляет метод GetChanges, а GetChangedset завершается ошибкой с той же ошибкой.

Ответы [ 2 ]

1 голос
/ 28 ноября 2011

Я предполагаю, что при удалении строки произошла какая-то ошибка. Когда вы добавляете строку сведений в главную строку, она автоматически присоединяется к контексту. Так что если вы добавите с:

myMasterRow.DetailsRows.Add(myDetails);

Вы должны использовать DeleteOnSubmit, чтобы отменить добавление:

context.DetailsRows.DeleteOnSubmit(myDetails);

Контекст данных достаточно умен, чтобы рассматривать удаление как «отмену добавления», поэтому запись никогда не попадет в базу данных.

0 голосов
/ 29 ноября 2011

Кажется, что если вы устанавливаете объект сущности и удаляете новую запись перед любой отправкой, Linq по-прежнему думает, что вы хотите добавить новую запись.В этом случае вы должны установить все объекты, которые имеют ссылки на FK, на null.

См. Этот пост, в котором подробно описывается проблема и решение: http://social.msdn.microsoft.com/Forums/en/linqtosql/thread/4170c7bb-f727-4e6a-9190-fc268ae4ce4b

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