实体框架级联删除 - 循环或多个级联路径

时间:2014-10-12 14:11:53

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

我有4个班级

  • 组件 - 包含有关类和接口的信息
  • 接口 - 都包含方法列表
  • 方式

每个组件包含更多接口,每个接口有更多方法

如果我删除组件,我还需要删除接口及其方法。你能给我一个提示如何配置 OnModelCreating 来解决这个问题吗? 接口方法似乎有问题。

我收到了这个错误:

  

在表上引入FOREIGN KEY约束'Interface_Methods'   “方法”可能会导致循环或多个级联路径。指定ON   DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY   限制。无法创建约束。

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {


         modelBuilder.Entity<Component>().
           HasMany(t => t.Classes).
           WithOptional().
           WillCascadeOnDelete();

        modelBuilder.Entity<Component>().
           HasMany(t => t.Interfaces).
           WithOptional().
           WillCascadeOnDelete();


        modelBuilder.Entity<Class>().
           HasMany(t => t.Methods).
           WithOptional().
           WillCascadeOnDelete();

       modelBuilder.Entity<Interface>().
          HasMany(t => t.Methods).
          WithOptional().
          WillCascadeOnDelete();


        modelBuilder.Conventions.Remove<ForeignKeyAssociationMultiplicityConvention>();

        base.OnModelCreating(modelBuilder);
    }

组件:

public class Component
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual List<Class> Classes { get; set; }
    public virtual List<Interface> Interfaces { get; set; }

    public Component()
    {
        Classes = new List<Class>();
        Interfaces = new List<Interface>();
    }
}

类别:

public class Class
{
    [Key]  
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual List<Method> Methods { get; set; }

    public Class()
    {
        Methods = new List<Method>();
    }
}

接口:

public class Class
{
    [Key]  
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual List<Method> Methods { get; set; }

    public Class()
    {
        Methods = new List<Method>();
    }
}

方法:

public class Method
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
}

1 个答案:

答案 0 :(得分:0)

由于方法可以被任意数量的类和接口引用,我不认为如果删除了其中一个类或接口,就会希望删除它。相反,请考虑让Component拥有方法并删除它们。

我没有先使用EF代码,所以这段代码的语法可能不正确,但希望得到重点:

modelBuilder.Entity<Component>().
    HasMany(t => t.Classes).
    WithOptional().
    WillCascadeOnDelete();

modelBuilder.Entity<Component>().
    HasMany(t => t.Interfaces).
    WithOptional().
    WillCascadeOnDelete();

modelBuilder.Entity<Component>().
    HasMany(t => t.Methods).
    WithOptional().
    WillCascadeOnDelete();

modelBuilder.Entity<Class>().
    HasMany(t => t.Methods).
    WithOptional();

modelBuilder.Entity<Interface>().
    HasMany(t => t.Methods).
    WithOptional();