У меня проблема с удалением в Entity Framework. Короче говоря, EF явно пытается удалить объект из базы данных, хотя я явно настроил EF для использования каскадных удалений в базе данных.
Мой дизайн:
У меня есть три типа объектов, MainEntity
], EntityTypeA
и EntityTypeB
. EF настроен на использование каскадного удаления при удалении EntityTypeA
и EntityTypeB
. Другими словами, если я удалю экземпляр MainEntity
, я хочу, чтобы все связанные экземпляры EntityTypeA
и EntityTypeB
также были удалены. Я никогда не удаляю EntityTypeA
или EntityTypeB
, не удаляя при этом их родительский элемент.
Моя проблема в том, что EF явно выдает инструкцию DELETE
для EntityTypeA
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"), он снова начнет работать.