Каскадное удаление в структуре сущностей (таблица для каждого типа наследования) - PullRequest
13 голосов
/ 30 января 2012

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

Проблема

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

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

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

Ответы [ 2 ]

7 голосов
/ 31 января 2012

Это известная проблема, и я бы назвал это ошибкой. Очевидно, что только удаление записей из таблицы A1 для свойств производного объекта не может быть правильным. Остальные данные в базе данных (в таблице A) представляют другой тип объекта. Другими словами: это УДАЛЕНИЕ фактически не удаляло сущность, но оно изменило тип сущности = преобразовало объект типа 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 и удалением родительских объектов

0 голосов
/ 04 февраля 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...