Подтвердить что ты не робот

Сопоставление отношения многих ко многим в корневом коде сущности

Я пытаюсь сделать тест в EF, создав много-много отношений, потому что я всегда сопоставляю One to One или One to Many, у меня есть пример в Интернете для try, пример работает для регистров вставки, но я не могу читать регистры

Вот мои классы, я не знаю, что такое HashSet, я получаю этот код на сайте

public class Person
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

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

    public Person()
    {
        CoursesAttending = new HashSet<Course>();
    }
}

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

    public ICollection<Person> Students { get; set; }

    public Course()
    {
        Students = new HashSet<Person>();
    }
}

Вот мой контекст

public class SchoolContext : DbContext
{
    public DbSet<Course> Courses { get; set; }
    public DbSet<Person> People { get; set; }

    public SchoolContext()
        : base("MyDb")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Course>().
            HasMany(c => c.Students).
            WithMany(p => p.CoursesAttending).
            Map(
                m =>
                {
                    m.MapLeftKey("CourseId");
                    m.MapRightKey("PersonId");
                    m.ToTable("PersonCourses");
                });

    }
}

Когда я вставляю регистры правильно

static void Main(string[] args)
{
    using (SchoolContext db = new SchoolContext())
    {
        Course math = new Course();
        Course history = new Course();
        Course biology = new Course();
        math.Title = "Math";
        history.Title = "History";
        biology.Title = "Biology";

        db.Courses.Add(math);
        db.Courses.Add(history);
        db.Courses.Add(biology);

        Person john = new Person();
        john.FirstName = "John";
        john.LastName = "Paul";
        john.CoursesAttending.Add(history);
        john.CoursesAttending.Add(biology);

        db.People.Add(john);
        db.SaveChanges();
    }
}

Но когда я пытаюсь выбрать регистр для показа контента, не работает, он просто ничего не печатает

static void Main(string[] args)
{
    using (SchoolContext db = new SchoolContext())
    {
        Pearson p = db.Peasons.First();
        Console.WriteLine(p.CoursesAttending.First().Title);
    }
}

У меня была проверка в базе данных, существуют регистры, в чем проблема?

Пожалуйста, научите меня, как сначала сделать выбор во многих отношениях с кодом.

4b9b3361

Ответ 1

Во-первых, вы можете включить ленивую загрузку, создав виртуальные коллекции:

public virtual ICollection<Course> CoursesAttending { get; set; }
public virtual ICollection<Person> Students { get; set; }

Это позволяет EF создавать производные классы (прокси) из Course и Person, которые переопределяют коллекции с логикой для загрузки своих данных из хранилища данных.

Когда вы это сделаете, вы увидите, что

Console.WriteLine(p.CoursesAttending.First().Title);

выполнит отдельный запрос для заполнения CoursesAttending.

В качестве альтернативы, или, кроме того, вы можете принять решение не допускать поездки туда и обратно в базу данных с помощью такой загрузки:

Person p = db.Persons.Include(p => p.CoursesAttending).First();

Задает Person и CoursesAttending за один снимок.

Ответ 2

Удалите конструктор класса и метод OnModelCreating. EF обрабатывает отношения Many to Many. Вам не нужно ничего делать.