Удалить объект, если у него есть дополнительный внешний ключ - PullRequest
0 голосов
/ 02 марта 2019

У меня есть модель, содержащая эти классы:

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 для класса SessionAttendance.

Оператор DELETE конфликтует с ограничением REFERENCE "FK_dbo.SessionAttendances_dbo.SessionTime_Session_Id".Конфликт произошел в базе данных "MyDb", таблице "dbo.SessionAttendances", столбце "Session_Id

, поскольку SessionAttendance имеет необязательный SessionTime, я запутался.

В чем проблема?Спасибо

1 Ответ

0 голосов
/ 19 марта 2019

Проблема заключается в том, что перед удалением записи необходимо сначала удалить соответствующие записи в таблицах внешнего ключа.

Из написанной вами логики необходимо добавить бизнес-сценарии для удаления строк SessionAttendances, содержащих Session_Id перед удалением записи Session.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...