c# - Entity Framework (核心) - 级联删除

标签 c# entity-framework entity-framework-core

我使用的是 EF Core 3.1.1,但我相信这个问题适用于所有版本的 EF。

EF 似乎具有级联删除的能力 - 如果它已启用,并且依赖对象是否已在上下文中加载。

var blog = context.blogs.Include(x => x.Posts).First(x => x.BlogId == id);
context.blogs.Remove(blog);

上面的语句删除了所有博客的帖子,然后是博客 - 每个都有不同的 sql 语句。

这就是我想要的,但是在使用代码优先时,它还创建了在数据库中启用级联删除的表。 ( ON DELETE CASCADE )

是否可以在 EF 中启用级联删除,并依赖 EF 删除依赖对象,而不启用数据库级级联删除? (还是我理解错误?)

原因是迁移失败,因为 SQL 不会在数据库中启用级联删除,因为它检测到多个级联路径(即使模式中不会自然出现多个)

谢谢!

最佳答案

实际上,EF Core 3.0 是 EF 的第一个版本,它通过 DeleteBehavior.ClientCascade 添加了此类功能选项(不幸的是尚未包含在文档的 Cascade Delete 部分):

For entities being tracked by the DbContext, dependent entities will deleted when the related principal is deleted.

If the database has been created from the model using Entity Framework Migrations or the EnsureCreated() method, then the behavior in the database is to generate an error if a foreign key constraint is violated.



很快,所有 Client*删除行为映射到 Restrict ,即在没有级联的情况下在数据库中强制执行 FK 关系。客户端行为仅适用于上下文跟踪的实体,因此请确保您 Include删除之前的相关数据(如您的示例中所示)。

要配置该选项,您至少需要流畅的 API 并具有有效的 Has + With为了到达OnDelete方法,例如
modelBuilder.Entity<Blog>()
    .HasMany(e => e.Posts)
    .WithOne(e => e.Blog)
    .OnDelete(DeleteBehavior.ClientCascade); 

关于c# - Entity Framework (核心) - 级联删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59796854/

相关文章:

c# - 在 docker 容器中包含 Entity Framework 工具

c# - 如何将连接字符串从startup.cs asp.net core传递到UnitOfWork项目

C# .NET 串行端口连接,不读取或写入

c# - 将 TEX 文件转换为 PDF 或 DOCX?

entity-framework - Code First 中的一对多关系播种

c# - 访问其他模型属性的自定义验证方法

entity-framework - 由于方法调用而嵌套 DbContext - Entity Framework

c# - 从带有外键的表中获取数据 C# Entity Framework

c# - 无法解析 System.Drawing.Printing

c# - 检查窗口是否真正关闭的更好方法