使用 EF Core 级联删除

Cascade deleting with EF Core

我目前在使用 EF Core 时遇到一些问题。我有一些数据需要删除,我正在努力查看 fluent API 是如何工作的,正是关于 .OnDelete() 函数。

考虑到 microsofts own websites 中的经典 blog/post 场景,我想知道 OnDelete() 到底是什么实体 'targeting'(因为缺少更好的词)在其他情况下,它似乎是博客,在其他情况下,是 post。是否可以从两侧定义级联删除(当父 Blog 被删除时 posts 被删除)如果是这样我想代码应该是这样的:

model.Entity<Post>().HasOne(p => p.Blog).WithMany(b => b.Posts).HasForeignKey(p => p.BlogId).OnDelete(DeleteBehavior.Cascade)

据我了解,这是说 "When a Blog is deleted, first delete all posts referencing this blog" 意思是 OnDelete(DeleteBehavior.Cascade) 适用于博客,不适用于 post。

但这是一样的吗?

model.Entity<Blog>().HasMany(b => b.Posts).WithOne(p => p.Blog).OnDelete(DeleteBehavior.Cascade)

或者 OnDelete(DeleteBehavior.Cascade) 适用于 Post 而不是博客?

级联删除总是在一个方向上工作——从主要实体从属实体,即删除主要实体会删除从属实体。对于一对多关系,one 端始终是 principalmany 端是依赖.

看来您对流畅的配置感到困惑。请注意,每个关系都由两端组成。流畅的配置允许您从一端开始并将其与另一端相关联,反之亦然,但您仍然在配置(定义) 关系。所以

Entity<A>().HasOne(a => a.B).WithMany(b => b.As)

相同
Entity<B>().HasMany(b => b.As).WithOne(a => a.B);

它们都定义了一种相同的关系。您选择哪一个并不重要,只需为每个关系使用单一配置以避免差异。

话虽这么说,

model.Entity<Post>().HasOne(p => p.Blog).WithMany(b => b.Posts)
    .HasForeignKey(p => p.BlogId)
    .OnDelete(DeleteBehavior.Cascade);

model.Entity<Blog>().HasMany(b => b.Posts).WithOne(p => p.Blog)
    .HasForeignKey(p => p.BlogId)
    .OnDelete(DeleteBehavior.Cascade);

是一回事,定义了从 BlogPost 的单个 一对多 关系。因为 Blogone 边而 Postmany 边,所以 Blog主要实体Post从属实体,因此删除Blog将删除相关的Post s.

参考: