многокаскадный путь удаления в отношении многие-многие (EF 4.1) - PullRequest
5 голосов
/ 20 мая 2011

СТОЛЫ:

Shop
Product
Category

ОТНОШЕНИЯ:

      (Shop) 1 <---> n (Categories)
      (Shop) 1 <---> n (Products)
(Categories) n <---> n (Products)

УДАЛЕНИЯ КАСКАДА:

      Shop  ---> Categories ... I defined this using fluent API
      Shop  ---> Products   ... I defined this using fluent API
Categories <---> Products   ... EF 4.1 automatically defines cascade for "Category_Product" join table

ПРОБЛЕМА: Выше приведено исключение «множественного» пути удаления каскада.

ИСПРАВЛЕНИЯ ПОТЕНЦИАЛА:

  1. Удалите ManyToManyConvention, но это означает, что я должен вручную выполнить удаление для каждой объединяемой таблицы в системе, что нецелесообразно.
  2. Я могу удалить каскадное удаление из Магазина-> Категория или Магазина-> Продукты.Но тогда у меня, вероятно, будет много осиротевших записей.

Как вы, ребята, справляетесь с этой проблемой?

СПАСИБО

1 Ответ

5 голосов
/ 20 мая 2011

Это не проблема сущности, а проблема сервера SQL.Я не думаю, что исключение на самом деле означает круговое каскадное удаление.Скорее всего, это означает несколько путей каскадного удаления, поскольку записи таблицы соединений могут быть удалены как со стороны категорий, так и со стороны продуктов из-за каскадирования из магазина.SQL-сервер не допускает этого, потому что ему требуются более сложные (и медленные) алгоритмы для правильного вычисления того, какие записи и когда необходимо удалять при каскадном подключении.

Просто вы должны прервать это, и это действительно будет означать, что выперед удалением магазина придется вручную удалить все связанные записи (категории или товары).Для этого потребуется хранимая процедура (или прямая команда SQL DELETE), в противном случае вам придется сначала загрузить их все и удалить их один за другим.

Редактировать:

Как вы указали в комментарии, этотакже может быть решена добавлением триггера BEFORE DELETE, который удалит связанные записи, если существует как замена одного каскадного пути.

...