Code First级联删除

时间:2014-09-29 18:24:35

标签: c# entity-framework ef-code-first

早上,我使用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& 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约束冲突&#34; FK_dbo.DeviceA_dbo.Devices_DeviceId&#34;。冲突发生在数据库&#34; CodeFirst&#34;,table&#34; dbo.DeviceA&#34;,column&#39; DeviceId&#39;。

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

但是,在尝试了几个小时之后,我无法级联删除超类中的记录A. 请指教。谢谢 !

1 个答案:

答案 0 :(得分:0)

尝试映射外键:

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