Использование Entity Framework У меня есть родительские и дочерние отношения между двумя таблицами. Я получаю данные из онлайн-источника и сохраняю данные локально.
Список детей изменяется во всех отношениях по мере того, как родитель проходит свою жизнь. Дети добавляются, удаляются или редактируются.
Шаг 1: В моем сценарии я получаю родителя с детьми 1 - 2. Я создаю этого родителя / детей, используя:
Parent p = new Parent();
Child c1 = new Child ();
c1.Name = "Test1";
Child c2 = new Child ();
c2.Name = "Test2";
p.Children.Add(c1);
p.Children.Add(c2);
context.AddToParents(p);
context.SaveChanges();
Шаг 2: В следующий раз, когда я обновлю ребенка № 2, больше не будет. В этом случае я запросил мой источник в Интернете и получил список детей, который не содержит дочерний элемент «Test2». Я симулирую это (потому что код никоим образом не воспроизводим), используя linq для удаления дочернего элемента из списка parent.Children.
Children определяется как (в Parent):
ObjectSet<Child> Children
Я удаляю дочерний элемент № 2 следующим образом:
var parent = (from p in context.Parents
where p.Name == "Parent"
select p).FirstOrDefault();
string childNameToRemove = "Test2";
var child = (from c in context.Children
where c.Name == childNameToRemove
select c).FirstOrDefault();
parent.Children.Remove(child);
context.SaveChanges();
Когда это происходит, дочерний элемент не удаляется из таблицы, но родительский ключ обнуляется.
Шаг 3: Позже, когда я получу обновление из онлайн-источника, потомок №2 снова стал одним из потомков. Когда я иду, чтобы добавить это обратно, я получаю нарушение ключа, потому что эта запись все еще находится в таблице.
var parent = (from p in context.Parents
where p.Name == "Parent"
select p).FirstOrDefault();
Child child = new Child();
child.Name = "Test2";
parent.Children.Add(child);
context.SaveChanges();
Я получаю эту ошибку:
"Нарушение ограничения PRIMARY KEY 'PK_Slave'. Невозможно вставить дубликат ключа в объект 'dbo.Child'. Значение дубликата ключа равно(Test2). \ R \ nОпределение завершено. "
Я предполагаю, что мне нужно либо удалить осиротевшего дочернего элемента из таблицы после обновления родительского элемента новыми данными (на шаге 2) или проверить существующую дочернюю запись с нулевым указателем на родителя и повторно использовать эту запись вместо добавления новой дочерней записи. Или, может быть, оба?
Есть ли лучший шаблон дизайна для этого? Я искал большую часть дня, и ответ уклоняется от меня.