Подтвердить что ты не робот

Cascade delete в структуре сущности (таблица на тип наследования)

У меня есть модель БД с таблицей на наследование типа. Например, сущностями являются A, B, C, A1, A2. База - A Производные - A1, A2. Другой - B, C. Таким образом, A имеет от 1 до 1 ассоциации с A1 и A2. B и C имеют ассоциации (от 1 до многих, с действием OnDelete на стороне БД) до A1 и A2 соответственно.

Проблема

Я пытаюсь удалить запись из B, поэтому я ожидаю, что EF удалит также все объекты A1, связанные с текущей записью B.

В конце EF удаляет запись из B и всех связанных записей из A1, но не из A

Почему? как это исправить?

4b9b3361

Ответ 1

Это известная проблема, и я бы назвал ее ошибкой. Очевидно, что только удаление записей из таблицы A1 для свойств производного объекта не может быть правильным. Остальные данные в базе данных (в таблице A) представляют собой другой тип объекта. Другими словами: этот DELETE фактически не удалял сущность, но он изменил тип сущности = преобразовал объект типа A1 в объект типа A - который делает еще меньше смысла, если A является абстрактным объектом.

Рекомендуемое обходное решение из здесь (как я понимаю) уродливо:

var b = context.Bs.Include("A1s").Single(b => b.Id == 1);
foreach (var a1 in b.A1s.ToList())
    context.As.Remove(a1);
context.Bs.Remove(b);
context.SaveChanges();

context.As.Remove(a1); должен удалять из таблицы A и A1, тем самым устраняя проблему потерянных записей в таблице A. К сожалению, вы вынуждены загружать детей из базы данных, чтобы правильно удалить родителя.

Вот еще один вопрос и ответ по этой проблеме: Проблемы с использованием TPT (Table Per Type) в EF 4.2 и удаление родительских объектов

Ответ 2

У меня была такая же проблема, и коллега сказал мне перебирать коллекцию предметов перед выполнением Remove (o), и внезапно все это сработало.