使用EF Core和具有继承的模型时进行级联删除



我正在尝试对EF模型进行一些更改,但遇到了级联删除的问题,我知道我以前也这样做过,但找不到哪里,也找不到我满意的解决方案。

这是现有模型的一个例子,我试图使用一些通用的东西,我们都会认识到(学校和学生/教师(之间的真实世界关系:

namespace Models
{
public class School
{
public guid Id { get; set; }
public string Name {get; set;}
public IList<Teacher> Teachers { get; set; }
}
public class Person
{
public guid Id { get; set; }
public string Name { get; set; }
public guid SchoolId SchoolId { get; set; }
public School School { get; set; }

public string TeachersUnionId { get; set; }
}    
}

这在数据库中为我们提供了一个学校表,在个人表上有一对多关系。

我们想做的是减少这个人的通用性,并将其分为教师对象和学生对象。

我是这样做的:

namespace Models
{
public class School
{
public guid Id { get; set; }
public string Name {get; set;}
}
public abstract class Person
{
public guid Id { get; set; }
public string Name { get; set; }
public guid SchoolId SchoolId { get; set; }
public School School { get; set; }
}    
public class Teacher : Person
{
public string TeachersUnionId { get; set; }
}
public class Student : Person
{
public string StudentUnionId { get; set;}
}
}

在DB中,它给了我们相同的结构,一个学校表格,在个人表格上有一个一到二的多,但个人表格现在有一个鉴别器,EF可以区分学生和老师。

这很好,可以按预期工作,我现在的问题是,我想将"学校"对象的导航属性添加到"学生和教师"中。

我们分两个步骤完成,首先是老师,所以学校的目标变成了:

public class School
{
public guid Id { get; set; }
public string Name {get; set;}
public IList<Teacher> Teachers { get; set; }
}

这起到了作用,使我们能够从一所学校导航到一群老师。

现在我们想添加Students Navigation属性,以便将学校对象修改为此

public class School
{
public guid Id { get; set; }
public string Name {get; set;}
public IList<Teacher> Teachers { get; set; }
public IList<Student> Students { get; set; }
}

但当我们为此应用迁移时,我们会得到

在表"Person"上引入FOREIGN KEY约束"FK_NAME"可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。

我通常对EF很好,但我很难理解为什么这次不起作用——正如我所说,我相信我们以前也使用过这种结构。

这是一个使用.net 5和Ef Core的C#项目。

有什么想法吗?

您可以通过OnDelete(DeleteBehavior.ClientCascade)指定来明确指定您需要的删除行为

builder.HasOne(d => d.Prop1)
.WithMany(p => p.Prop2)
.HasForeignKey(d => d.Prop3)
.OnDelete(DeleteBehavior.ClientCascade)
.HasConstraintName("FK_Table1_Table2");

DeleteBehavior枚举有其他选项,如CascadeClientSetNull

最新更新