entity-framework - 当实体具有可选外键时删除实体
问题描述
我有一个包含这些类的模型:
Curriculum
类有几个SessionTime
s 和其他类使用这些实体。
它们的配置类是:
public class SessionAttendanceConfiguration : EntityTypeConfiguration<SessionAttendance>
{
public SessionAttendanceConfiguration()
{
HasOptional(x => x.Session)
.WithMany(x => x.SessionAttendance)
.WillCascadeOnDelete(false);
}
}
public class SessionTimeConfiguration : EntityTypeConfiguration<SessionTime>
{
public SessionTimeConfiguration()
{
HasMany(x => x.ClassSessions)
.WithOptional(x => x.SessionTime)
.WillCascadeOnDelete(false);
HasMany(x => x.SessionAttendance)
.WithOptional(x => x.Session)
.WillCascadeOnDelete(false);
}
}
public class StudentAttendanceConfiguration : EntityTypeConfiguration<StudentAttendance>
{
public StudentAttendanceConfiguration()
{
HasMany(x => x.SessionAttendances)
.WithRequired()
.WillCascadeOnDelete();
}
}
public class ClassSessionConfiguration : EntityTypeConfiguration<ClassSession>
{
public ClassSessionConfiguration()
{
HasRequired(x => x.EducationDay)
.WithMany(x => x.Sessions)
.WillCascadeOnDelete(true);
HasOptional(x => x.SessionTime)
.WithMany(x => x.ClassSessions)
.WillCascadeOnDelete(false);
}
}
public class CurriculumConfiguration : EntityTypeConfiguration<Curriculum>
{
public CurriculumConfiguration()
{
HasRequired(x => x.Course)
.WithOptional(x => x.Curriculum);
}
}
当我想删除一个Course
对象时,首先我加载所有孩子并将它们标记为Deleted
,最后从上下文中删除该课程。
像这样的东西:
if (course.StudentAttendances.IsNullOrEmpty())
context.Entry(course).Collection(x => x.StudentAttendances);
// Load other children
// Mark list children as deleted
if (!course.Curriculum.Sessions.IsNullOrEmpty())
{
for (int i = course.Curriculum.Sessions.Count - 1; i >= 0; i--)
{
var session = course.Curriculum.Sessions[i];
context.Entry(session).State = EntityState.Deleted;
}
}
// Remove course
context.Courses.Remove(course);
SessionTime
删除操作以与类的外键相关的错误结束SessionAttendance
。
DELETE 语句与 REFERENCE 约束“FK_dbo.SessionAttendances_dbo.SessionTime_Session_Id”冲突。冲突发生在数据库“MyDb”、表“dbo.SessionAttendances”、列“Session_Id”中
由于SessionAttendance
有一个 optional SessionTime
,我很困惑。
有什么问题?谢谢
解决方案
问题是您必须先删除外键表中的关联记录,然后才能删除记录。
从您编写的逻辑中,您需要添加业务场景以删除包含删除记录Session_Id
之前的SessionAttendances 行。Session