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

时间:2011-03-29 10:55:00

标签: entity-framework ef-code-first entity-framework-4.1 cascading-deletes

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

设置: 表A< - 表B.

表B的FK指向表A的PK。

为什么这不起作用?

2 个答案:

答案 0 :(得分:54)

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

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; }
}

Fluent API:

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

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

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

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

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

documentation

中查看详情

答案 1 :(得分:0)

modelBuilder
.Entity<Product>()
.HasRequired(p => p.Category)
.WithMany(x => x.Products)
.WillCascadeOnDelete(true);