Ответ 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 и удаление родительских объектов