如何确保首先在EF代码中的表关系上启用级联删除?

jaf*_*ffa 28 entity-framework cascading-deletes ef-code-first entity-framework-4.1

我想使用代码优先在表上启用CASCADE DELETE.从头开始重新创建模型时,即使关系是自动设置,也不会设置CASCADE DELETE.奇怪的是,它可以为一些具有多对多关系的表启用此功能,您可能认为它可能存在问题.

设置: 表A < - 表B.

表B的FK指向表A的PK.

为什么这不起作用?

Sla*_*uma 55

您没有获得级联删除的可能原因是您的关系是可选的.例:

public class Category
{
    public int CategoryId { get; set; }
}

public class Product
{
    public int ProductId { get; set; }
    public Category Category { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在此模型中,您将获得一个Product表,该表具有Category表的外键,但此键可以为空,并且默认情况下数据库中没有级联删除设置.

如果您想要有所需的关系,那么您有两个选择:

注释:

public class Product
{
    public int ProductId { get; set; }
    [Required]
    public Category Category { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

流畅的API:

modelBuilder.Entity<Product>()
            .HasRequired(p => p.Category)
            .WithMany();
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,都会自动配置级联删除.

如果您希望将关系设置为可选但是使用级联删除,则需要明确配置:

modelBuilder.Entity<Product>()
            .HasOptional(p => p.Category)
            .WithMany()
            .WillCascadeOnDelete(true);
Run Code Online (Sandbox Code Playgroud)

编辑:在最后一个代码片段中,您也可以简单地编写.WillCascadeOnDelete().此无参数重载默认设置true为设置级联删除.

文档中查看更多相关内容

  • @Jon:不,CascadeOnDelete一般不会关闭.惯例说:如果你的关系/导航属性是"必需的"(=外键/引用被禁止为null),它就会打开.但是,如果您的关系/导航是"可选的"(=允许外键/引用为空),它就会关闭.您可以在以下两种情况下覆盖约定:您可以关闭所需导航属性的级联删除,也可以将其打开以获取可选的导航属性.您也可以关闭"OneToManyCascadeDeleteConvention".然后,您始终要在Fluent API中指定所需内容. (3认同)
  • +1这比doc更具信息量.感谢有关可选关系的细节 (2认同)