Первые циклы кода Entity Framework или несколько каскадных путей

У нас есть база данных, которая создает несколько ошибок каскадных путей. Я понимаю, что это значит и что происходит, но я хотел бы знать лучший подход, поскольку мы должны удалить некоторые из имеющихся у нас опций OnDelete Cascade.

Это структура нашей таблицы:

SCHOOL
- SchoolId  
- Name
- ....

STUDENT
- StudentId
- SchoolId
- Name
- ...

COURSE
- CourseId
- SchoolId
- Name

STUDENT-COURSE
- StudentId
- CourseId
- ....
  • SchoolId FK in Student удаляет всех учеников, связанных каскадом, при удалении школы
  • SchoolId FK in Course удаляет все курсы, связанные каскадом, при удалении школы
  • StudentId FK в Student-Course удаляет все студенческие курсы, связанные каскадом, при удалении учащегося
  • CourseId FK в Student-Course удаляет все студенческие курсы, связанные каскадом, при удалении курса

Итак, у нас есть цикл, потому что при удалении школы объект Student-Course будет удален с двух разных сторон, создавая цикл.

Я понимаю, что здесь происходит:

HasMany(p => p.Students)
   .WithRequired(p => p.School)
   .HasForeignKey(p => p.SchoolId)
   .WillCascadeOnDelete(true);  

И я знаю, что могу:

HasMany(p => p.Students)
    .WithRequired(p => p.School)
    .HasForeignKey(p => p.SchoolId)
    .WillCascadeOnDelete(false); 

Вопрос здесь в том, что было бы лучшим подходом.

Спасибо.


person John Mathison    schedule 07.12.2016    source источник
comment
Студентов, вероятно, больше, чем курсов, поэтому каскадное удаление студентов + студенческих курсов более эффективно.   -  person Gert Arnold    schedule 07.12.2016


Ответы (1)


Я бы удалил каскад при удалении из школы и оставил остальные как есть, а при удалении школы добавил бы некоторую логику для удаления связанных студентов, курсов (но он сохраняет согласованность для удаления на более низких уровнях). Если вы удалите каскад при удалении для студентов, вам нужно будет вручную добавить логику удаления для них, чтобы сначала очистить связанные студенческие курсы, и это будет как-то несовместимо с удалением курсов (иерархический уровень не соответствует логике удаления).

person Andrei Filimon    schedule 07.12.2016
comment
Звучит неплохо, так что уберите код с верхних уровней и добавьте немного логики в код для этих уровней. Таким образом, нижние уровни не нуждаются в логике. Спасибо !!! - person John Mathison; 07.12.2016