2011-01-16 7 views
1

Я пытаюсь обновить ресурс следующим образом:Удаление дочерних объектов

public void Update(Resource resource) { 

    Resource _resource = _resourceRepository.First(r => r.Id == resource.Id); 

    _resource.Content = resource.Content; 
    _resource.Description = resource.Description; 
    _resource.Locked = resource.Locked; 
    _resource.Name = resource.Name; 

    _resource.Restrictions.ToList().ForEach(r => _resource.Restrictions.Remove(r)); 

    foreach (Restriction restriction in resource.Restrictions) 
    _resource.Restrictions.Add(new Restriction { Property = _propertyRepository.First(p => p.Id == restriction.Property.Id), Value = restriction.Value }); 

    } // Update 

У меня есть что-то подобное, и работать, чтобы создать ресурс, с одной лишь разницей: я не удалить ограничения.

Я получаю следующее сообщение об ошибке:

A relationship from the 'Restrictions_ResourceId_FK' AssociationSet is in the 'Deleted' state. Given multiplicity constraints, a corresponding 'Restrictions' must also in the 'Deleted' state.

Что я упускаю?

ответ

11

EF сделал именно то, что вы ему сказали. Удаление элемента из коллекции навигации родительского объекта устраняет связь между родительским и дочерним объектами. Это означает, что он только устанавливает для параметра ResourceId в ограничении значение null, которое не допускается вашей моделью сущности.

Если ваше Ограничение не может существовать без соответствующего ресурса, вы должны моделировать отношение как Идентификация. Это означает, что первичный ключ ограничения также будет содержать столбец ResourceId. Когда вы удаляете ограничение из коллекции родительских объектов, EF удаляет ограничение, а не устанавливает значение ResourceId равным null.

3

У меня были аналогичные проблемы, так как напротив Add() явно казался Remove().

Вместо этого вы должны использовать функцию DeleteObject() для удаления дочерних элементов.

Спасибо.

Смежные вопросы