目前我在使用EF Core时遇到了一些问题。我有一些我需要删除的数据,我很想知道流畅的API如何工作,完全与.OnDelete()
函数有关。
考虑到来自microsofts own websites的经典博客/帖子方案,我想知道什么实体,OnDelete()
正是'定位' (因为缺少一个更好的词)在某些情况下,似乎是博客,在其他情况下,这个帖子。 Cascade删除是否可以从双方定义(当父博客是删除帖子时),如果是这样,我想代码应该是这样的:
model.Entity<Post>().HasOne(p => p.Blog).WithMany(b => b.Posts).HasForeignKey(p => p.BlogId).OnDelete(DeleteBehavior.Cascade)
据我所知,这是说&#34;删除博客后,首先删除引用此博客的所有帖子&#34;意思是OnDelete(DeleteBehavior.Cascade)
适用于博客,而不是发布。
但这是一样的吗?
model.Entity<Blog>().HasMany(b => b.Posts).WithOne(p => p.Blog).OnDelete(DeleteBehavior.Cascade)
或OnDelete(DeleteBehavior.Cascade)
是否适用于Post而不是博客?
答案 0 :(得分:21)
级联删除始终在一个方向上工作 - 从主体实体到依赖实体,即删除主体实体会删除依赖实体。对于一对多关系,一个方始终是主体,多个方是依赖
看起来你对流畅的配置感到困惑。请注意,每个关系由两端组成。流畅的配置允许您从其中一个端开始并将其与另一端相关联,反之亦然,但您仍在配置(定义)单个关系。所以
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
是一个方,而Post
是多个方,Blog
是主要实体而Post
是依赖实体,因此删除Blog
会删除相关的Post
。
<强>参考:强>