http://weblogs.asp.net/zeeshanhirani/archive/2010/07/23/removing-entity-from-a-related-collection.aspx точно объясняет, что с вами произошло.
Предположим, у вас есть дизайн класса примерно такой:
Entity Framework сгенерирует необходимые столбцы внешнего ключа и добавит к ним ограничения NOT NULL
, поскольку все рецепты всегда будут связаны только с одним ControlUnit.
Таким образом, во время выполнения у вас будут объекты, похожие на следующий макет:
Теперь ваш код вступает в игру и удаляет связь между объектами Recipe и их ControlUnit:
При попытке сохранить в данный момент в базе данных нет идентификатора ControlUnit для вставки в столбец внешнего ключа NOT NULL
. Текущее состояние объекта нарушает приведенную выше диаграмму классов и не может быть сохранено в макете базы данных, сгенерированном в предположении, что каждый рецепт связан с одним ControlUnit. Вот почему база данных отказывается сохранять изменения, и вы видите исключение.
Это также объясняет, почему это работает, когда вы раскомментируете строку, удаляющую сущность: сущность удаляется из базы данных вместе с ее отношением, поэтому никакие ограничения не нарушаются, поэтому не исключение.
"Но я установил ON DELETE CASCADE
на отношения ..."
Да, но это срабатывает только при удалении объекта, а не при удалении отношения. При установленном ON DELETE CASCADE
это должно работать:
controlUnitRepository.DeleteObject(_controlUnit);
// deletes the ControlUnit and all associated Recipe entities
Если вы хотите инициировать удаление сущностей Рецепта при удалении их связи с ControlUnit, ваши отношения должны быть не простой ассоциацией, а скорее композицией:
EF изначально не поддерживает это, но вы можете эмулировать поведение, используя идентифицирующие отношения. Как только объект находится в идентифицирующем отношении к родительскому объекту, и это отношение удаляется, объект также удаляется. Кажется, это было твоим намерением с самого начала. Для получения дополнительной информации об идентификации отношений см. Реализация идентификации отношений с EF4 , где я реализовал идентификацию отношений с EF4 и связался с большим количеством материалов для чтения.