Entity Framework каскадно удаляет родительскую строку в самоссылающейся таблице - PullRequest
6 голосов
/ 29 февраля 2012

В моей базе данных 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 обновлять родительские идентификаторы дочерних строк?

PS: здесь я обнаружил точно такую ​​же проблему без ответа (MSDN)

...