簡體   English   中英

在 EF Core Migration 中設置級聯刪除時,它不會在數據庫中強制執行嗎?

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

為什么在父實體和子實體之間設置級聯刪除時不會在遷移中創建級聯?

通常的博客/帖子示例:

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: 引用操作. 限制

我知道 EF 實際上會在內部執行級聯刪除,只要您包含子對象以使其工作,但為什么不利用數據庫服務級聯刪除能夠在一個命令中刪除它而不是 1 + n SQL 命令,即1 x 博客記錄和 nx 個帖子。

想象一下,有 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 項目中並立即復制它。

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

    }

我不確定為什么要這樣做,但計划找出答案,我認為它來自我們之前使用的模板。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM