C# Fluent API未以一对一的关系在删除时级联
我有两门课:C# Fluent API未以一对一的关系在删除时级联,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,我有两门课: public class Student { public long StudentId { get; set; } public StudentDetails details { get; set; } } public class StudentDetails { public long StudentDetailsId { get; set; } public Student student{ get; set; } //other
public class Student
{
public long StudentId { get; set; }
public StudentDetails details { get; set; }
}
public class StudentDetails
{
public long StudentDetailsId { get; set; }
public Student student{ get; set; }
//other properties
}
一个学生包含一个学生详细信息。如果没有相应的学生,则studentdetails不能存在
使用这些映射:
public StudentMapping()
{
this.ToTable("Student");
this.HasKey(x => x.StudentId);
this.HasRequired(x => x.details)
.WithRequiredDependent(x => x.student)
.WillCascadeOnDelete(true);
}
public StudentDetailsMapping()
{
this.ToTable("StudentDetails");
this.HasKey(x => x.StudentDetailsId);
this.HasRequired(x => x.student);
}
但是,当我转到SQL Management Studio中的数据库并执行以下操作时:DELETE FROM StudentId==1的STUDENTS时,会删除Student行,但删除不会级联到studentdetails行。怎么了?当我删除StudentDetails行的StudentParent对象时,我正试图将其删除。您是否检查了MSDN上的SO和文章
如我所见,您的模型不是真正的一对一关系,因为这里的两个实体不共享相同的主键
当您对这样的关系进行建模时,实际上是在数据库中创建一个一对多表结构:如何防止StudentDetailsId不被其他学生使用?我的意思是,你可以用商业规则来强制执行,但严格来说没有规则
如果您想以一对一的方式使用EF强制执行级联删除,则需要执行以下操作:
public class Student
{
public long StudentId { get; set; }
public StudentDetails details { get; set; }
}
public class StudentDetails
{
public long StudentId { get; set; }
public Student student{ get; set; }
//other properties
}
public StudentMapping()
{
this.ToTable("Student");
this.HasKey(x => x.StudentId);
this.HasRequired(x => x.details)
.WithRequiredDependent(x => x.student)
.WillCascadeOnDelete(true);
}
public StudentDetailsMapping()
{
this.ToTable("StudentDetails");
this.HasKey(x => x.StudentId);
this.HasRequired(x => x.student);
}
希望有帮助:)这帮了我的忙,谢谢。我需要阅读EF code first如何建模不同的关系多重性类型!