当前位置: 首页 > 知识库问答 >
问题:

使用EF核心级联删除

东方飞捷
2023-03-14

我目前对EF Core有一些问题。我有一些需要删除的数据,我正在努力查看流畅的API是如何工作的,正是关于。OnDelete()函数。

考虑到微软自己网站的经典博客/帖子场景,我想知道到底是什么实体,OnDelete()是“目标”(因为没有更好的词),在某些情况下,它似乎是博客,在另一些情况下,是帖子。是否可以从两侧定义级联删除(即当父博客被删除时,帖子被删除),如果是这样,我认为代码应该如下所示:

<代码>模型。实体

据我所知,这是说“删除博客时,首先删除引用此博客的所有帖子”,意思是“删除行为”(DeleteBehavior.Cascade)适用于博客,而不是帖子。

但这是一样的吗?

<代码>模型。实体

还是OnDelete(删除行为。级联)适用于Post而不是blog?

共有1个答案

梁福
2023-03-14

级联删除始终在一个方向上工作-从主体实体到从属实体,即删除主体实体会删除从属实体。对于一对多的关系来说,一方总是主要的,而多方是从属的。

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

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将删除相关的Posts。

参考:

  • 关系-术语定义
 类似资料:
  • 我有一个使用ef核心代码优先方法构建的项目的审计机制。我已经在“OnModelCreating”函数中为一些表设置了“deleteBhavior”属性以级联。当我删除一个实体时,另一个实体会通过级联删除行为自动删除。现在一切都很好,我需要获取所有已删除的实体,但我不能。ChangeTracker不包含级联删除的实体。如何获取级联删除的值?有没有办法做到这一点?

  • 我有一个地址模型,它适用于我系统中的所有模型,如下所示: 在OnModelCreating中: 它的工作非常好!我唯一的问题是关于级联删除。如何设置此方案: 删除某人时,级联删除PersonalAddress和Addresses 删除地址时,级联删除PersonalAddress而不是Person 目前我看到删除Person会删除Person地址(但不会删除相关地址)。 我并不是在抱怨这种行为,但

  • 升级核心3.0后,无法在包管理器中添加迁移。这是我的错误

  • 我需要了解全局禁用EF Core 2中级联删除的方法。感谢您的帮助。 在EF 6. x中,我们使用以下代码来禁用和实现上的级联删除:

  • 我的问题和这个差不多。 ASP。Net Core与EF Core和CosmosDB-身份问题 提供的答案不起作用。这会产生其他问题。当我从升级我的应用程序时,这些错误开始出现。NET Core 3.1 to。净5。降级应用程序使所有错误都消失了。显然,这个问题与efcore 5中引入的对cosmos的乐观并发支持有关。 https://docs.microsoft.com/en-us/ef/cor

  • 创建后,是否可以提取用于创建它的? (也许可以通过使用类似于,EF架构体系服务等)