使用EF Core删除级联

ras*_*s91 16 c# entity-framework-core .net-core asp.net-core-2.0 ef-core-2.0

我目前在EF Core遇到了一些问题.我有一些我需要删除的数据,我很想知道流畅的API如何工作,完全与.OnDelete()函数有关.

考虑到微软自己的网站的经典博客/帖子情景,我想知道什么实体,正是OnDelete()"目标"(缺乏一个更好的词)在某些情况下,它似乎是博客,在其他情况下,帖子.是否可以从双方定义Cascade删除(当父博客是删除帖子时),如果是这样,我想代码应该如下所示:

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)适用于Post而不是博客?

Iva*_*oev 30

级联删除始终在一个方向上工作 - 从主体实体依赖实体,即删除主体实体删除依赖实体.而对于一对多的关系的一个侧面始终是主要很多方面是依赖.

看起来你对流畅的配置感到困惑.请注意,每个关系由两端组成.流畅的配置允许您从一端开始并将其与另一端相关联,反之亦然,但您仍在配置(定义)单个关系.所以

Entity<A>().HasOne(a => a.B).WithMany(b => b.As)
Run Code Online (Sandbox Code Playgroud)

是相同的

Entity<B>().HasMany(b => b.As).WithOne(a => a.B);
Run Code Online (Sandbox Code Playgroud)

他们都定义了一个相同的关系.您选择哪一个并不重要,只需为每个关系使用单个配置以避免出现差异.

话虽如此,

model.Entity<Post>().HasOne(p => p.Blog).WithMany(b => b.Posts)
    .HasForeignKey(p => p.BlogId)
    .OnDelete(DeleteBehavior.Cascade);
Run Code Online (Sandbox Code Playgroud)

model.Entity<Blog>().HasMany(b => b.Posts).WithOne(p => p.Blog)
    .HasForeignKey(p => p.BlogId)
    .OnDelete(DeleteBehavior.Cascade);
Run Code Online (Sandbox Code Playgroud)

是一个且相同的,并定义单一到许多从关系BlogPost.由于Blog一个侧和Post许多方面,Blog主要实体Post依赖实体,因此,删除Blog将删除相关Post秒.

参考:

  • 我不记得了.但我会举个例子.假设您有关系A - > B - > D和A - > C - > D.当您删除A时,它将删除相关的B和C.可以通过A - > Bs或A - > Cs删除相关的Ds,因此您有循环(或多个级联路径). (4认同)
  • 我想你的意思是所谓的*多个级联路径*.是的,SqlServer存在此类问题,该规则适用于EF(Core)模型.只要它们不形成循环,就可以与级联删除有多个FK关系.您应该总是尝试强制执行级联删除,如果更新数据库因多个级联路径异常而失败,那么您应该打破循环但是关闭一个或多个关系的级联删除并手动删除相关数据. (3认同)
  • 非常感谢您提供非常明确的答案 :) 我刚刚读到 SQL Server 仅支持从表上的一个 FK 进行级联删除。这意味着我不能真正依靠级联删除,仍然必须在我的删除功能中实现某些相关对象的删除,对吗? (2认同)