在 EF Core Migration 中设置级联删除时,它不会在数据库中强制执行吗?

In EF Core Migration when setting Cascade Delete does it not enforce it in the database?

为什么在父实体和子实体之间设置级联删除时,它不会在迁移中创建级联?

普通博客/Post示例:

class Blog
{
    public int Id { get;set; }
    public IList<Post> Posts { get;set;}
}

class Post
{
    public int Id { get;set; }
    public Blog Blog { get;set;}
}

在 EntityTypeConfiguration 文件中

public override void Configure(EntityTypeBuilder<Notification> builder)
    {
 
        builder.HasMany(n => n.Posts).WithOne(e => e.Blog)
            .OnDelete(DeleteBehavior.Cascade);
    }

为什么要创建迁移脚本?

            ...
            migrationBuilder.AddForeignKey(
            name: "FK_Posts_Blogs_BlogId",
            table: "Posts",
            column: "BlogId",
            principalTable: "Blogs",
            principalColumn: "Id",
            onDelete: ReferentialAction.Restrict);
            ...

注意

onDelete: ReferentialAction.Restrict

我知道 EF 实际上会在内部执行级联删除,只要您包含要处理的子对象,但为什么不利用数据库服务级联删除能够在一个命令中而不是 1 个命令中删除它+ n SQL 个命令 即 1 x 博客记录和 n x 帖子。

假设有 1000 条帖子,而您要删除一个博客。

在浏览了我试图执行此操作的项目后,我意识到 Dbcontext 是从一个基础 class 继承而来的,该基础在...

private void ConfigureEntities(ModelBuilder modelBuilder)
    {
        modelBuilder.ApplyConfigurationsFromAssembly(GetType().Assembly);

        var entityTypes = modelBuilder.Model
            .GetEntityTypes()
            .ToList();

        // Disable cascade delete
        var foreignKeys = entityTypes
            .SelectMany(e => e.GetForeignKeys().Where(f => f.DeleteBehavior == DeleteBehavior.Cascade));
        foreach (var foreignKey in foreignKeys)
        {
            foreignKey.DeleteBehavior = DeleteBehavior.Restrict;
        }
    }

最后我把这个复制到Gist Project中,直接复制了。

protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.ApplyConfigurationsFromAssembly(typeof(TestContext).Assembly);

        var entityTypes = modelBuilder.Model
            .GetEntityTypes()
            .ToList();
        var foreignKeys = entityTypes
        .SelectMany(e => e.GetForeignKeys().Where(f => f.DeleteBehavior == DeleteBehavior.Cascade));
        foreach (var foreignKey in foreignKeys)
        {
            foreignKey.DeleteBehavior = DeleteBehavior.Restrict;
        }

    }

我不确定为什么要这么做,但我打算找出答案,我认为它来自我们之前使用的模板。