c# - 使用 EF Core 级联删除

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

我目前在使用 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);

是一回事,定义了从 BlogPost 的单个一对多 关系。由于Blogone 端而Postmany 端,Blog主要实体Post从属实体,因此删除Blog将删除相关的发布

引用:

关于c# - 使用 EF Core 级联删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48692144/

相关文章:

c# - CSOM 在线共享点出现问题

c# - 如何在.NET Core中反序列化NetDataContractSerializer数据?

c# - 如何将 ILogger 注入(inject) EFCore DbContext

entity-framework-core - NoSQL 与 Entity Framework 核心

c# - 编译器琐事 : What is consequence of this code

c# - 从没有承载前缀的授权 header 中获取访问 token

c# - 如果我使用 Task.Wait() 而不是等待,则不会显示 MessageDialog 任务

c# - EF Core - 字符串或二进制数据将被截断

c# - WPF 如何更改 ContentControl 内容

javascript - mvc 和 ajax - 未命中模型属性