2014-10-12 69 views
0

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

  • 组件 - 包含的类和接口
  • 类信息,接口 - 两者都含有的方法
  • 名单
  • 方法

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

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

我得到这个错误:

Introducing FOREIGN KEY constraint 'Interface_Methods' on table 'Methods' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint.

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

回答

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