В моей базе данных MS SQL Server 2008 у меня есть самостоятельная таблица с категориями для иерархии (ID и ParentID). Таблица имеет собственное ограничение внешнего ключа и триггер «Вместо удаления» для выполнения удаления полного узла с его дочерними элементами.
Для управления данными я использую Entity Framework (4.3) с моделью, сгенерированной из БД с самоотслеживающими объектами и ObjectContext
(сгенерированной шаблоном VS). EDM также имеют самостоятельную ассоциацию с сущностью «категория».
Я столкнулся с проблемой при попытке удалить любую родительскую строку, которая имеет хотя бы одну дочернюю строку.
После того, как я позвоню:
Entity.MarkAsDeleted();
Context.SaveChanges();
В SQL Server Profiler я вижу, что EF сначала генерирует оператор обновления, чтобы установить для ParentID дочерних строк значение null, а затем удаляет родительскую строку! Конечно, каскадное правило в БД не работает, и дочерние узлы остаются как в контексте EF, так и в БД.
Я пытался установить правило ассоциации «При удалении» на «Каскад» и «Нет», но это не имеет смысла...
Как я могу выполнить каскадное удаление в таблице, ссылающейся на себя, с помощью EF или, по крайней мере, как запретить EF обновлять родительские идентификаторы дочерних строк?