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

Bro*_*Cow 5 c# entity-framework-core .net-core

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

常见博客/帖子示例:

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;}
}
Run Code Online (Sandbox Code Playgroud)

在 EntityTypeConfiguration 文件中

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

为什么要创建迁移脚本?

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

请注意

onDelete:ReferentialAction.Restrict

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

想象一下,有数千个帖子,而您正在删除一个博客。

Bro*_*Cow 2

在查看了我试图执行此操作的项目后,意识到 Dbcontext 是从基类继承的,该基类具有此代码......

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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

最后我将其复制到 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;
        }

    }
Run Code Online (Sandbox Code Playgroud)

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