代码优先级联删除

本文关键字:删除 级联 代码 | 更新日期: 2023-09-27 18:25:02

Morning,我使用Code First构建了我的数据库,并实现了每类型表(TPT)方法的继承层次结构。下面是我项目的一个示例模型:

public enum Type
{
    A = 0,
    B = 1
}
public abstract class Device
{
    public int DeviceId { get; set; }
    public Type Type { get; set; }
}
[Table("DeviceA")]
public class DeviceA : Device
{
    public int Value { get; set; }
}
[Table("DeviceB")]
public class DeviceB : Device
{
    public int Value { get; set; }
}

我有一张表,它与a&B.型号如下:

public class Sir
{
    public int SirId { get; set; }
    [Required]
    public virtual DeviceA DeviceA { get; set; }
    public virtual DeviceB DeviceB { get; set; }
}

OnModelCreating功能如下:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Sir>()
            .HasRequired(s => s.DeviceA)
            .WithMany()
            .WillCascadeOnDelete(true);
        modelBuilder.Entity<Sir>()
            .HasOptional(s => s.DeviceB)
            .WithMany()
            .WillCascadeOnDelete(false);
        base.OnModelCreating(modelBuilder);
    }

当我试图删除超类中的设备时,问题来了。SQL错误提示:

DELETE语句与REFERENCE约束"FK_dbo.DeviceA_dbo.Devices_DeviceId"冲突。冲突发生在数据库"CodeFirst"的表"dbo.DeviceA"的列"DeviceId"中。

据我所知,根据MSDN文档http://msdn.microsoft.com/en-us/data/jj591620.aspx(在启用级联删除的标题部分下),它指出。如果依赖实体上的外键不可为null,则"代码优先"将对关系设置级联删除。如果依赖实体上的外键可以为null,则Code First不会对关系设置级联删除,并且删除主体时,外键将设置为null

但是,在尝试了几个小时后,我仍然无法级联删除超类中的记录a。请告知。谢谢

代码优先级联删除

尝试映射外键:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Sir>()
        .HasRequired(s => s.DeviceA)
        .WithMany()
        .Map(m => m.MapKey("DeviceA_Id"))
        .WillCascadeOnDelete(true);
    modelBuilder.Entity<Sir>()
        .HasOptional(s => s.DeviceB)
        .WithMany()
        .Map(m => m.MapKey("DeviceB_Id"))
        .WillCascadeOnDelete(false);
    base.OnModelCreating(modelBuilder);
}