使用EF Core删除级联

时间:2018-02-08 18:12:59

标签: c# .net-core entity-framework-core asp.net-core-2.0 ef-core-2.0

目前我在使用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而不是博客?

1 个答案:

答案 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);

是同一个,并定义从BlogPost的单个一对多关系。由于Blog一个方,而Post多个方,Blog主要实体Post依赖实体,因此删除Blog会删除相关的Post

<强>参考: