Управление дочерними списками с помощью LINQ to SQL - PullRequest
1 голос
/ 15 сентября 2009

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

Нарушение ограничения ПЕРВИЧНЫЙ КЛЮЧ 'PK_Child_1. Не могу вставить дубликат введите объект 'dbo.Child'.

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

context.DeleteAllOnSubmit(parent.Children);
foreach (string childname in listBox1.SelectedItems) {
    parent.Children.Add(new Child(parentkey, childname));
}
context.SubmitChanges();

У каждого родителя есть уникальный ключ (GUID), и все родительские и дочерние столбцы не могут иметь значение NULL. Дочерняя таблица - это простая таблица из двух столбцов с родительским ключом и значением varchar с составным первичным ключом, состоящим из обоих столбцов.

Спасибо

1 Ответ

4 голосов
/ 15 сентября 2009

Проблема в том, что вы добавляете новые элементы до того, как старые будут удалены.

Linq-to-SQL имеет четко определенный порядок операций при вызове SubmitChanges() (вам также следует обязательно использовать SubmitChanges() - не Save()!):

* Inserts
* Updates
* Deletes

(для справки см. здесь и здесь )

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

Но так как ВСТАВКА новых элементов происходит перед удалением, у вас возникает конфликт.

Что вам нужно сделать, это одна из двух вещей:

  • либо вы удаляете дочерние узлы, а затем вызываете SubmitChanges() до , снова добавляя новые элементы

OR

  • вы изменяете свою логику, чтобы дочерние узлы, которые все еще существуют, сначала не удалялись, а затем снова добавлялись; измените свою логику на только удалить те элементы, которые действительно удалены (и не добавлены обратно), и вставьте только те, которые действительно новые

С помощью любого из этих двух шагов вы должны заставить вашу систему работать.

Марк

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