实体框架(核心)-级联删除

时间:2020-01-18 01:44:10

标签: c# entity-framework entity-framework-core

我正在使用EF Core 3.1.1,但是我认为这个问题适用于所有版本的EF。

似乎EF具有级联删除的功能-如果启用了EF,并且从属对象已加载到上下文中。

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

以上语句删除所有博客帖子,然后删除博客-每个帖子都有不同的sql语句。

这是我想要的,但是在使用代码优先时,它还会创建在数据库中启用级联删除的表。 (ON DELETE CASCADE

是否可以在EF中启用级联删除,并依靠EF删除相关对象,而不同时启用数据库级级联删除? (还是我理解不正确?)

原因是迁移失败,因为SQL无法检测数据库中的级联删除,因为它检测到多个级联路径(即使架构中自然不会出现多个级联路径)

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以如下所示将级联行为添加到您的实体。 在OnModelCreating内部;

foreach (var foreignKey in builder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
            {
                foreignKey.DeleteBehavior = DeleteBehavior.Cascade;
            }

enter image description here

答案 1 :(得分:0)

感谢评论/帖子。

我的EF模型类和配置正确。问题是我的架构中存在多个级联路径的位置,这是可以的,因为这些路径中的主项从未删除(软删除)。尽管EF在多个级联路径上没有问题,但SQL确实可以,并且在尝试更新数据库时SQL会引发错误。

我不想禁用级联删除并在代码中设置复杂的级联功能,只是因为存在多个级联路径的几个地方。

但是,问题是我没有正确考虑。我真正需要做的就是在导致多条路径的FK上禁用级联,并让其余部分保持启用状态。当我问这个问题时,我想我只是精疲力尽。 :)

答案 2 :(得分:0)

对于ef core 3,您无需在“ WithOne”中进行任何思考

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
    .HasMany(e => e.Posts)
    .WithOne()
    .OnDelete(DeleteBehavior.ClientCascade); 
}