Entity Framework (Core) - каскадное удаление - PullRequest
1 голос
/ 18 января 2020

Я использую EF Core 3.1.1, но я считаю, что этот вопрос относится ко всем версиям EF.

Кажется, EF имеет возможность каскадного удаления - если оно включено, и если зависимые объекты загружаются в контекст.

var blog = context.blogs.Include(x => x.Posts).First(x => x.BlogId == id);
context.blogs.Remove(blog);

Приведенное выше утверждение удаляет все сообщения блога, а затем блог - каждый с отдельным оператором sql.

Это то, что я однако при использовании code-first он также создает таблицы с включенным каскадным удалением в базе данных. (ON DELETE CASCADE)

Можно ли включить каскадное удаление в EF и полагаться на EF-удаление зависимых объектов, не включая также каскадное удаление на уровне базы данных? (Или я неправильно это понимаю?)

Причина в том, что миграции не удаются, потому что SQL не разрешит каскадное удаление в базе данных, так как обнаруживает несколько каскадных путей (даже если множественные пути не возникнут естественным образом в схема)

Спасибо!

Ответы [ 2 ]

1 голос
/ 18 января 2020

На самом деле EF Core 3.0 является первой версией EF, которая добавляет такую ​​возможность с помощью опции DeleteBehavior.ClientCascade (к сожалению, пока не включена в раздел документации Каскадное удаление ):

Для объектов, отслеживаемых DbContext, зависимые объекты будут удалены при удалении связанного принципала.

Если база данных была создана из модели с использованием Entity Framework Migrations или EnsureCreated(), то поведение в базе данных заключается в том, что в случае нарушения ограничения внешнего ключа возникает ошибка.

Вскоре все действия Client* delete отображаются на Restrict, т.е. ФК отношения в базе данных без каскада. Поведение клиента применяется только к сущностям , отслеживаемым контекстом, поэтому убедитесь, что вы Include связали данные перед удалением (как в вашем примере).

Чтобы настроить параметр, вам нужно для того, чтобы перейти к методу OnDelete, например,

modelBuilder.Entity<Blog>()
    .HasMany(e => e.Posts)
    .WithOne(e => e.Blog)
    .OnDelete(DeleteBehavior.ClientCascade); 
, требуется как минимум свободный API, имеющий действительный Has + With
0 голосов
/ 18 января 2020

Спасибо за комментарии / посты.

Мои классы модели EF и конфигурация верны. Проблема заключается в том, что в моей схеме есть несколько каскадных путей, и это нормально, потому что основной элемент в этих путях никогда не удаляется (программно удаляется). В то время как EF не имеет проблемы с несколькими каскадными путями, SQL наверняка это делает, а SQL выдает ошибки при попытке обновить базу данных.

Я не хотел отключать каскадное удаление и настраивать сложное каскадирование функциональность в коде, просто из-за пары мест, где существуют несколько каскадных путей.

Однако проблема в том, что я не думал об этом правильно. Все, что мне действительно нужно, это отключить каскадирование на FK, которые вызывают множественные пути, и оставить его включенным для остальных. Я думаю, что я просто сгорел, когда задал этот вопрос. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...