0

エンティティとして公開されている結合テーブルを使用して、多対多の関係を設定する場合はfollowed the docsです。EFコアの多対多リレーションシップで削除をモデル化するにはどうすればよいですか?

しかし、ドキュメントには削除について何をすべきかは言及されていません。

たとえば、Studentには多くの教師がおり、Teacherには多くの生徒がいます。結合エンティティ/テーブルはStudentTeacherです。

テーブル/エンティティに参加する:

public class StudentTeacher { 
    public int StudentId { get; set; } 
    public Student Student { get; set; } 
    public int TeacherId { get; set; } 
    public Teacher Teacher { get; set; } 
} 

結合テーブル/エンティティの設定:

modelBuilder.Entity<StudentTeacher>() 
    .HasOne(b => b.Teacher) 
    .WithMany(b => b.StudentTeachers) 
    .HasForeignKey(b => b.TeacherId) 
    .IsRequired() 
    .OnDelete(/* ... what goes here? ...*/); 

modelBuilder.Entity<StudentTeacher>() 
    .HasOne(b => b.Student) 
    .WithMany(b => b.StudentTeachers) 
    .HasForeignKey(b => b.StudentId) 
    .IsRequired() 
    .OnDelete(/* ... what goes here? ...*/); 

私はOnDelete()に何を使うのですか?なぜ?あまりにも(Cascade)を削除したり、禁止し、エラーをスロー:

答えて

0

< = EF6がそれを必要としなかったので、それは、結合テーブルをモデル化するために最初に混乱思われます。しかし、それは実際には簡単です。

Teacherエンティティを削除する場合、その関係をすべてのStudentエンティティに削除する必要があります。 Studentエンティティを削除するときは、その関係をすべてのTeacherエンティティに削除する必要があります。

したがって、参加エンティティは常にCASCADEを削除する必要があります。

+0

はい、あなたは正しいです。これは私が私の関係テーブルのほとんどをしたものです。私はdb側の関係を削除したくないのはどうですか?私はいくつかの重要な関係を記録またはアーカイブする必要があります。この教師の生徒の例では、これは必要ではありませんが、私はそのような状況があります。あなたは何をやって何を提案しますか? @grokky – kizilsu

+0

@kizilsu私は、最も簡単なのは、データベースにトリガを設定し、そのように監査ログを作成すると仮定します。または、EFでマップし、削除するたびにエントリを作成します。 – grokky

1

.OnDelete(/* ... what goes here? ...*/);

あなたは(StudentまたはTeacherで)親レコードが削除された場合(StudentTeacherで)子レコードで何をしなければならないかDBここで指定する必要があります(Restrict)を返します。 Restrictでは、親レコードを削除する前に手動で子レコードを削除する必要があります。

しかし、各リレーションシップに適用する必要があるアクションのみを決定することができます。これはアプリケーションであり、すべての要件を把握していません。

重要Cascade、削除して、たとえば、Teacherは、(削除)(TeacherIdを対応する)StudentTeacherでのレコードのみに影響を与えますが、Studentsはそのまま維持されます。

重要2:MS SQL Serverのでは、あなただけの1 Cascadeに(他のRestrictをする必要があります)を設定することができ、または移行を適用する際にエラーが表示されます(あなたが使用しているDBエンジン書いていませんでした)( テーブル_some_table_上のFOREIGN KEY制約_some_name_がサイクルまたは複数のカスケードパスを引き起こすことが紹介。

+0

私は既に削除モードの違いを知っていますが、これは特別なケースです。これは結合テーブルのためです。 grokky

+1

これは私がカスケードを使うべきかどうかという私の問題の一つです。私はカスケードしましたが、カスケード削除操作はdb側で実行されています。トリガーがない場合は、レコードを取得しません。だから、私は、ユーザーが学生や教科に教師を削除するような登録テーブルを更新するときに、削除プロセスを実行しました。したがって、私は操作を追跡し、レコードを保存することができます。あなたも@grokkyのようにすることができます – kizilsu

+0

@kizilsuドミトリーの答えは正しいですし、問題に良い背景を与えます。しかし、使用する削除モードを決めるには、私の答えも見てください。 – grokky

関連する問題