Каскадное удаление с помощью Entity Framework - Связанные объекты, удаленные EF

У меня проблема с удалением в 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"), он снова начнет работать.

29
задан Crypt32 27 October 2016 в 20:11
поделиться