代码之家  ›  专栏  ›  技术社区  ›  rasmus91

使用EF核心级联删除

  •  56
  • rasmus91  · 技术社区  · 7 年前

    目前我对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) 是否应用于帖子而不是博客?

    1 回复  |  直到 6 年前
        1
  •  116
  •   Ivan Stoev    7 年前

    级联删除始终在一个方向上工作-从 主要实体 从属实体 ,即删除主体实体将删除从属实体。对于一对多关系 侧面始终是 最重要的 以及 许多的 侧面是 依靠的 .

    看起来你被流畅的配置搞糊涂了。请注意,每个关系都由两端组成。fluent配置允许您从一端开始,并将其与另一端关联,反之亦然,但您仍然在配置(定义)一个 仅有一个的 关系所以

    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 . 自从 博客 侧面和 邮递 许多的 一边,一边 博客 主要实体 以及 邮递 从属实体 ,因此删除 博客 将删除相关 邮递 s

    参考号: