Я провел некоторое исследование по inte rnet и нашел этот блог пост об изучении Entity Framework, но после того, как я его кодировал, казалось, что это не то, что я хотел.
Как и в примере на блоге, у меня есть Students
и Courses
. Но я не хочу, чтобы мои курсы знали, связаны ли они с курсами или нет (я бы тоже не стал беспокоиться). Но я хочу, чтобы у каждого студента было n курсов, и чтобы каждый курс мог быть назначен более чем одному студенту.
public class Student
{
public int id {get; set;}
public string name {get; set;}
public ICollection<Course> courses {get;set;} //or another proper container abstraction
}
public class Course
{
public int id {get; set}
public string name {get; set;}
}
Поэтому я бы запросил Student
, чтобы узнать его курсы. Я реализовал это, создал миграцию, запустил ее на базе данных SQL Server и реализовал немного ASP. NET Core API с методами CRUD. Когда я добавил второй Student
, который использовал тот же Course
, первый Student
потерял Course
.
Затем я реализовал решение, которое предлагает блог:
public class StudentCourse
{
public int student_id {get;set; }
public Student student {get; set; }
public int course_id {get; set; }
public Course course {get; set; }
}
и добавьте к DbContext
этот фрагмент кода:
modelBuilder.Entity<StudentCourse>().HasKey(sc => new { sc.SId, sc.CId });
modelBuilder.Entity<StudentCourse>()
.HasOne<Student>(sc => sc.Student)
.WithMany(s => s.StudentCourses)
.HasForeignKey(sc => sc.SId);
modelBuilder.Entity<StudentCourse>()
.HasOne<Course>(sc => sc.Course)
.WithMany(s => s.StudentCourses)
.HasForeignKey(sc => sc.CId);
И Student
и Course
каждый будет иметь ICollection<StudentCourse>
в качестве членов. Проблема, с которой я столкнулся при таком подходе, заключается в том, что я не могу легко создать экземпляр Student
в своем коде, поскольку сам Student
является членом его члена StudentCourse
.