使用 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 端始终是 principal 而 many 端是依赖.
看来您对流畅的配置感到困惑。请注意,每个关系都由两端组成。流畅的配置允许您从一端开始并将其与另一端相关联,反之亦然,但您仍然在配置(定义)单 关系。所以
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);
是一回事,定义了从 Blog
到 Post
的单个 一对多 关系。因为 Blog
是 one 边而 Post
是 many 边,所以 Blog
是 主要实体而Post
是从属实体,因此删除Blog
将删除相关的Post
s.
参考:
我目前在使用 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 端始终是 principal 而 many 端是依赖.
看来您对流畅的配置感到困惑。请注意,每个关系都由两端组成。流畅的配置允许您从一端开始并将其与另一端相关联,反之亦然,但您仍然在配置(定义)单 关系。所以
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);
是一回事,定义了从 Blog
到 Post
的单个 一对多 关系。因为 Blog
是 one 边而 Post
是 many 边,所以 Blog
是 主要实体而Post
是从属实体,因此删除Blog
将删除相关的Post
s.
参考: