我目前在使用 EF Core 时遇到了一些问题。我有一些数据需要删除,我正在努力查看 Fluent API 的工作原理,正是关于 .OnDelete()
的。功能。
考虑来自 microsofts own websites 的经典博客/帖子场景, 我想知道什么实体,正是 OnDelete()
是“目标”(因为缺少更好的词)在某些情况下,它似乎是博客,在其他情况下,是帖子。是否可以从两侧定义级联删除(当父博客删除时删除帖子)如果是这样我想代码应该是这样的:
model.Entity<Post>().HasOne(p => p.Blog).WithMany(b => b.Posts).HasForeignKey(p => p.BlogId).OnDelete(DeleteBehavior.Cascade)
据我了解,这是在说“删除博客时,首先删除引用此博客的所有帖子”,意思是 OnDelete(DeleteBehavior.Cascade)
适用于博客,不适用于发布。
但这是一样的吗?
model.Entity<Blog>().HasMany(b => b.Posts).WithOne(p => p.Blog).OnDelete(DeleteBehavior.Cascade)
或者OnDelete(DeleteBehavior.Cascade)
适用于帖子而不是博客?
最佳答案
级联删除总是在一个方向上工作 - 从主要实体到从属实体,即删除主要实体会删除从属实体。对于一对多关系,一端始终是主体,多端是从属 .
看来您对流畅的配置感到困惑。请注意,每个关系都由两端组成。流畅的配置允许您从一端开始并将其与另一端相关联,反之亦然,但您仍然在配置(定义)单一 关系。所以
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
将删除相关的发布
。
引用:
关于c# - 使用 EF Core 级联删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48692144/