加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

.net-core – 使用EF Core删除级联

发布时间:2020-12-16 03:40:14 所属栏目:asp.Net 来源:网络整理
导读:我目前在EF Core遇到了一些问题.我有一些我需要删除的数据,我很想知道流畅的API如何工作,完全与.OnDelete()函数有关. 考虑到microsofts own websites的经典博客/帖子情景,我想知道什么实体,确切地说OnDelete()是’目标'(缺少一个更好的词)在某些情况下它似乎
我目前在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)

据我所知,这是说“当博客被删除时,首先删除所有引用此博客的帖子”,这意味着OnDelete(DeleteBehavior.Cascade)适用于博客,而不是发布.

但这是一样的吗?

model.Entity< Blog>().HasMany(b => b.Posts).WithOne(p => p.Blog).OnDelete(DeleteBehavior.Cascade)

或者OnDelete(DeleteBehavior.Cascade)是否适用于Post而不是博客?

解决方法

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

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

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将删除相关帖子.

参考:

> Relationships – Definition of terms
> Cascade Delete

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读