Каскадное удаление с помощью Entity Framework - связанные объекты, удаленные EF - PullRequest
28 голосов
/ 27 марта 2011

У меня проблема с удалением в Entity Framework.Короче говоря, EF явно пытается удалить объект из базы данных, хотя я специально настроил EF для использования каскадного удаления в базе данных.

Мой дизайн:

У меня есть три типа сущностей, MainEntity, EntityTypeA и EntityTypeB.EF был настроен на использование каскадного удаления при удалении EntityTypeA и EntityTypeB.Другими словами, если я удаляю экземпляр MainEntity, я хочу также удалить все связанные экземпляры EntityTypeA и EntityTypeB.Я никогда не удаляю EntityTypeA или EntityTypeB, не удаляя при этом и их родителя.

Моя проблема в том, что EF явно выдает оператор DELETE для EntityTypeA, что приводит к сбою приложения.

Вот как выглядит моя модель:

Ответы [ 2 ]

41 голосов
/ 27 марта 2011

Именно так ведет себя каскадное удаление в EF.Установка Cascade для отношения в конструкторе EF указывает EF выполнять оператор DELETE для каждой загруженной реализованной сущности.В базе данных ничего не говорится о ON CASCADE DELETE.

Настройка удаления каскада при использовании EF требует двух шагов:

  • Установка Каскад для отношения вEF дизайнер.В этом контексте указывается, что все загруженные связанные объекты должны быть удалены до удаления родительского объекта.Если этого не произойдет, EF сгенерирует исключение, потому что внутреннее состояние обнаружит, что загруженные дочерние элементы не связаны ни с какой существующей родительской сущностью, даже если отношение требуется.Я не уверен, если это произойдет до выполнения оператора удаления родительского объекта или после, но нет никакой разницы.EF не перезагружает связанные объекты после выполнения модификаций, поэтому он просто не знает о каскадных удалениях, запущенных в базе данных.
  • Установить ON CASCADE DELETE для отношения в базе данных.Это будет указывать SQL на удаление всех связанных записей, которые не были загружены в контекст во время удаления родительского элемента.

Реализация каскадного удаления в EF странная и довольно неэффективнаяно это то, как он ведет себя, и если вы хотите его использовать, вы должны изменить свое приложение для правильного поведения в этом сценарии.

5 голосов
/ 28 мая 2015

Вместо дизайнера EF можно также установить каскадное удаление для ограничений FK в базе данных.

Ниже приведены визуальные шаги из Sql Server Management Studio (SSMS) о настройке каскадного удаления.

Обратите внимание, когда закончите, не забудьте обновить edmx для базы данных, прежде чем пытаться удалить. Я обсуждаю это более подробно в своем блоге: Entity Framework Cascading Deletes;Установите его из базы данных.

...