У меня проблема с удалением в Entity Framework. Короче говоря, EF явно пытается удалить объект из базы данных, хотя я специально настроил EF для использования каскадных удалений в базе данных.
Мой дизайн:
У меня есть три типа сущностей, MainEntity
, EntityTypeA
и EntityTypeB
. EF был настроен на использование удаления каскада при удалении EntityTypeA
и EntityTypeB
. Другими словами, если я удалю экземпляр MainEntity
, я хочу, чтобы все связанные экземпляры EntityTypeA
и EntityTypeB
также были удалены. Я никогда не удаляю EntityTypeA
или EntityTypeB
, не удаляя их родителя.
Моя проблема заключается в том, что EF явно выдает инструкцию DELETE
для EntityTypeA
, что приводит к сбою моего приложения.
Вот как выглядит моя модель:
Отношения имеют следующий нестандартный конфигурационный файл:
-
MainEntity -> EntityTypeA OnDelete: Cascade
-
MainEntity -> EntityTypeB OnDelete: Cascade
Отношение EntityTypeA -> EntityTypeB
имеет OnDelete: None
Содержимое базы данных
INSERT INTO MainEntities (Name) values ('Test')
insert into EntityTypeA (MainEntityID) VALUES (1)
insert into EntityTypeB (MainEntityID, EntityTypeAId) VALUES (1, 1)
insert into EntityTypeB (MainEntityID, EntityTypeAId) VALUES (1, 1)
Мой код:
class Program
{
static void Main(string[] args)
{
var context = new Model1Container();
var mainEntity = context.MainEntities.Include("EntityTypeA").SingleOrDefault();
context.DeleteObject(mainEntity);
context.SaveChanges();
}
}
Что происходит
Когда я вызываю SaveChanges, Entity Framework выполняет следующие действия в базе данных:
exec sp_executesql N'delete [dbo].[EntityTypeA]
where ([Id] = @0)',N'@0 int',@0=1
Это вызывает нарушение внешнего ключа, поскольку в таблице EntityTypeB есть ссылки на экземпляры EntityTypeA.
Вопрос
Почему Entity Framework выдает явное удаление для экземпляра EntityTypeA, хотя я настроил Entity Framework для использования каскадных удалений? Если я удалю Include ( "EntityTypeA" ), он снова начнет работать.