28

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

设置: 表 A <- 表 B。

表 B 的 FK 指向表 A 的 PK。

为什么这行不通?

4

2 回答 2

57

您没有得到级联删除的可能原因是您的关系是可选的。例子:

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

public class Product
{
    public int ProductId { get; set; }
    public Category Category { get; set; }
}

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

如果您想获得所需的关系,那么您有两种选择:

注释:

public class Product
{
    public int ProductId { get; set; }
    [Required]
    public Category Category { get; set; }
}

流畅的 API:

modelBuilder.Entity<Product>()
            .HasRequired(p => p.Category)
            .WithMany();

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

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

modelBuilder.Entity<Product>()
            .HasOptional(p => p.Category)
            .WithMany()
            .WillCascadeOnDelete(true);

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

文档中查看更多信息

于 2011-03-29T11:18:55.860 回答
0
modelBuilder
.Entity<Product>()
.HasRequired(p => p.Category)
.WithMany(x => x.Products)
.WillCascadeOnDelete(true);
于 2015-02-05T11:34:55.890 回答