具有可选外键时删除实体

时间:2019-03-02 07:13:22

标签: entity-framework exception ef-code-first

我有一个包含以下类的模型:

enter image description here

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

出什么问题了?谢谢

1 个答案:

答案 0 :(得分:0)

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

根据您编写的逻辑,您需要添加业务场景以删除包含Session_Id的SessionAttendances行,然后再删除Session记录。