0

私は を持っておりStudentCourseそれらの間の関係はStudentCourseです。これらのクラスのフィールドは次のとおりです。

public class Student
    {
        public int StudentId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int CourseId { get; set; }
        [ForeignKey("CourseId")]
        public Course Course { get; set; }
    }


public class Course
    {
        public int CourseId { get; set; }
        public string CourseName { get; set; }
    }



public class StudentCourse
    {   
        public int ID { get; set; }
        public virtual Student Student { get; set; }
        public virtual Course Course {get;set;}
    }

テーブル内の学生を削除するとstudent、対応する行を関係から削除したいと思いますStudentClass。どうすればいいですか?

4

1 に答える 1

1

実際には、 と の間に多対多の関係が必要だと思いますStudent。学生は多くのコースに参加でき、コースには多くCourseの学生が参加できます。

この場合、モデルを単純化できます。

public class Student
{
    public int StudentId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public ICollection<Course> Courses { get; set; }
}

public class Course
{
    public int CourseId { get; set; }
    public string CourseName { get; set; }
    public ICollection<Student> Students { get; set; }
}

「結合エンティティ」StudentCourseは必要ありません。EF は、このモデルから 3 つのテーブルを作成します。Studentsテーブル、Coursesテーブル、およびStudentCourses(またはCourseStudents) テーブルで、複合主キーを持つ(StudentId, CourseId)(または同様の名前が付けられます)。どちらの部分も、それぞれのテーブルへの外部キーです。

データベースの 2 つの FK リレーションシップでは、カスケード削除がデフォルトでオンになります。したがって、Studentが削除されると、結合テーブル内のリンク レコードは自動的に削除されます。Courseが削除された場合も同様です。

結合テーブルおよび結合テーブル列の詳細な名前を明示的に定義することもできます。また、単一のコレクションのみを操作することもできます。たとえば、 のCoursesコレクションのみで、 のコレクションは使用しませStudentん。これには Fluent API を使用する必要があります。StudentsCourse

modelBuilder.Entity<Student>()
    .HasMany(s => s.Courses)
    .WithMany() // no parameter if there is no collection in Course
    .Map(m =>
    {
        m.MapLeftKey("StudentId");
        m.MapRightKey("CourseId");
        m.ToTable("StudentCourses");
    });
于 2013-01-01T17:38:57.113 に答える