首页 > 解决方案 > 当实体具有可选外键时删除实体

问题描述

我有一个包含这些类的模型:

在此处输入图像描述

Curriculum类有几个SessionTimes 和其他类使用这些实体。

它们的配置类是:

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,我很困惑。

有什么问题?谢谢

标签: entity-frameworkexceptionef-code-first

解决方案


问题是您必须先删除外键表中的关联记录,然后才能删除记录。

从您编写的逻辑中,您需要添加业务场景以删除包含删除记录Session_Id之前的SessionAttendances 行。Session


推荐阅读