2016-12-07 7 views
0

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

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

SCHOOL 
- SchoolId 
- Name 
- .... 

STUDENT 
- StudentId 
- SchoolId 
- Name 
- ... 

COURSE 
- CourseId 
- SchoolId 
- Name 

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

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

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

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); 

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

Спасибо.

+0

Есть, вероятно, больше студентов, чем курсы, поэтому более эффективное использование каскадного удаления студентов + студенческих курсов. –

ответ

1

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

+0

Звучит неплохо, поэтому удалите с верхних уровней и выполните некоторую логику кода для этих уровней. Таким образом, нижние уровни не нуждаются в логике. Благодаря !!! –

Смежные вопросы