我有一个包含以下类的模型:
Curriculum
类具有几个SessionTime
,而其他类则使用这些实体。
它们的配置类为:
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
类的外键有关的错误结束。
DELETE语句与REFERENCE约束“ FK_dbo.SessionAttendances_dbo.SessionTime_Session_Id”冲突。数据库“ MyDb”的表“ dbo.SessionAttendances”的列“ Session_Id
”中发生了冲突
由于SessionAttendance
有一个可选的SessionAttendance
,我很困惑。
出什么问题了?谢谢
答案 0 :(得分:0)
问题是您必须先删除外键表中的关联记录,然后再删除记录。
根据您编写的逻辑,您需要添加业务场景以删除包含Session_Id
的SessionAttendances行,然后再删除Session
记录。