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

标签 c# .net-core entity-framework-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;}
}

在实体类型配置文件中

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 是从一个基类继承而来的,该基类在...

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;
        }

    }

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

关于c# - 在 EF Core Migration 中设置级联删除时,它不会在数据库中强制执行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70880889/

相关文章:

c# - 单例类继承

c# - 为什么 nameof 不能与 CreationAtAction return 语句一起使用

c# - 如何捆绑.Net Core API + Angular 前端

c# - Entity Framework Core 添加迁移给出的值不能为空。 (参数 'connectionString')

c# - 如何在 MouseEnter 上为 TextBlock 添加下划线

java - Java 中的 .Net Guid.ToByteArray() 相当于什么

c# - 在 Blazor 中的两个子组件之间共享数据的最佳方式

C# Entity Framework Core - LINQ 检查一个数组在另一个数组中是否存在

c# - 抑制 EF 核心 3.0.x 初始化消息

c# - ProgressBar 从另一个线程更新