2016-12-07 21 views
0

複数のカスケードパスエラーが発生するデータベースがあります。 私はそれが何を意味し、何が起こっているのか理解していますが、私たちが持っているOnDelete Cascadeオプションのいくつかを削除しなければならないので、最良の方法を知りたいと思います。エンティティフレームワーク最初のサイクルコードまたは複数のカスケードパス

これが私たちのテーブル構造である:学生でSchoolId FKをカスケードに関連するすべての学生を削除

SCHOOL 
- SchoolId 
- Name 
- .... 

STUDENT 
- StudentId 
- SchoolId 
- Name 
- ... 

COURSE 
- CourseId 
- SchoolId 
- Name 

STUDENT-COURSE 
- StudentId 
- CourseId 
- .... 
  • 学校を削除するときに削除するときにコースで
  • SchoolId FKはカスケードに関連するすべてのコースを削除します
  • スチューデントコースのFKは、学生を削除するときにカスケードに関連するすべての学生コースを削除します。
  • コース - 学生コースのFKを削除しますそこでここではもちろん

を削除するときに、学校を削除するとき、エンティティ学生-コースはサイクルを作成し、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

学校から削除カスケードを削除し、他のものをそのまま残しておきます。学校を削除するときに、関連する生徒を削除するロジックを追加します(コースは下位レベルの削除の一貫性を保ちます)。 生徒から削除カスケードを削除する場合は、関連する生徒のコースを最初に削除するための削除ロジックを手動で追加する必要があり、コースの削除とは一貫して一致しません(階層レベルは削除ロジックに関して一貫しません)。

+0

それは良いサウンドだから、上位レベルから削除し、それらのレベルのコードでいくつかのロジックを実行します。このようにして、より低いレベルはロジックを必要としません。ありがとう!!! –

関連する問題