Как создать отношения многие ко многим в Entity Framework Core - PullRequest
0 голосов
/ 03 мая 2020

Я провел некоторое исследование по 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.

1 Ответ

0 голосов
/ 03 мая 2020

Посмотри в своей базе. Это

public ICollection<Course> courses {get;set;}

Создает прямое FK отношение на курсе, ссылающемся на ученика. Вы вообще не используете свой объект StudentCourse. Должно быть

public class Student
{
    public int id {get; set;}
    public string name {get; set;}

    public virtual ICollection<StudentCourse> Courses {get;} = new HashSet<StudentCource>();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...