我有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; }
}
答案 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();