Теперь DbContext или EF, скорее, правильно удаляет обе записи, если я
удалить OtherPerson в моем коде. Тем не менее, я должен удалить
запись непосредственно из базы данных, запись о сиротах остается в
Стол людей.
Вы, кажется, говорите, что хотите удалить запись из таблицы OtherPeople
(производная сущность), и каскадное удаление должно обеспечить удаление соответствующей записи в таблице People
(базовая сущность).
Но это неправильное направление. EF создает отношение и ограничение внешнего ключа, которое переходит из таблицы базовых сущностей в таблицу производных сущностей, поэтому: таблица PK равна People
, а таблица FK равна OtherPeople
. С помощью каскадного удаления для этого отношения вы можете гарантировать, что запись OtherPeople
будет удалена только тогда, когда будет удалена соответствующая запись People
, а не наоборот.
Одно только это отношение - также без каскадного удаления - гарантирует, что вы не сможете получить потерянные записи в таблице OtherPeople
, потому что это нарушит ограничение FK. (Вы не можете удалить Person
без связанного OtherPerson
.)
Для вашей специальной цели вам фактически понадобится второе ограничение FK в базе данных, где таблица PK равна OtherPeople
, а таблица FK
равна People
. Это отношение вообще не создается сопоставлением EF TPT, и оно также будет работать только в том случае, если PK на People
не является удостоверением (по крайней мере, в SQL Server). Но это идентичность в вашей модели. Таким образом, вы даже не можете создать эту связь с помощью каскадного удаления в базе данных, не говоря уже о EF.
Возвращаясь к взаимосвязи, которую EF создает в базе данных (а не к каскадному удалению), я не думаю, что в EF Code-First есть опция отображения, которая позволила бы вам контролировать взаимосвязь необходим для картирования TPT. Единственный способ - сделать это непосредственно в базе данных или - если вы хотите сгенерировать базу данных из вашей модели Code-First - написать необработанный оператор SQL (который устанавливает каскадное удаление) в пользовательском инициализаторе и отправить его в базу данных. после того, как все таблицы и отношения были созданы.
Каким-то образом в базе данных People
похоже на Order
, а OtherPeople
похоже на OrderItem
- только не 1-to-*
, а 1-to-0..1
. Вы хотите, чтобы родительский элемент Order
был удален, если удален дочерний элемент OrderItem
, что означает, что зависимый пользователь удалит участника.