Entity Framework возвращает ICollection <> без значений

У меня есть 2 объекта в отношении "многие-ко-многим", и я хотел бы добавить ученика в класс, но после получения объекта класса из запроса он показывает, что свойство пусто. Я видел много подобных проблем, но в этом случае мне не помог ни один ответ.

Вот мои занятия:

Студенческая организация

class Student
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual string Surname { get; set; }

    public Student()
    {
        Classes = new HashSet<Class>();
    }

    public virtual ICollection<Class> Classes { get; set; }
}

Сущность класса

class Class
{
    public virtual int Id { get; set; }
    public virtual string ClassName { get; set; }

    public Class()
    {
        Students = new HashSet<Student>();
    }

    public virtual ICollection<Student> Students { get; set; }
}

Контекст

class DatabaseContext : DbContext
{
    public DbSet<Student> Students { get; set; }
    public DbSet<Class> Classes { get; set; }

    public DatabaseContext()
    {
        Database.SetInitializer<DatabaseContext>(new Initializer());
    }
}

Инициализатор

class Initializer : DropCreateDatabaseAlways<DatabaseContext>
{
    protected override void Seed(DatabaseContext context)
    {
        Student student1 = new Student { Id = 1, Name = "Name", Surname = "Surname" };

        Class class1 = new Class { Id = 1, ClassName = "Math"};
        class1.Students.Add(student1); // The Count of the collection is 1

        context.Students.Add(student1);
        context.Classes.Add(class1);

        base.Seed(context);
    }
}

Теперь, когда я пытаюсь получить объект с помощью метода, счетчик коллекции равен 0

public static Class GetClass(int classId)
    {
        using (var context = new DatabaseContext())
        {
            Class receivedClass = context.Classes.Find(classId); // The collection is empty, the ClassName is there, though

            return receivedClass;
        }
    }

Я хотел бы знать, как я могу добавить объект в коллекцию другого объекта, а затем иметь возможность также получить объект с содержимым в коллекции

Вам нужен SavaChanges() в классе инициализатора.

Llazar 03.11.2018 17:03

Я пробовал, но результат тот же

Fihii 03.11.2018 17:05

Какую версию EF вы используете.

Llazar 03.11.2018 17:07

Я использую версию EF 6.2.0

Fihii 03.11.2018 17:08

Я думаю, что этот class1.Students.Add(student1); не нужен, потому что вы добавляете студентов с context.Students.Add(student1);. И вам нужно добавить SaveChanges после.

Llazar 03.11.2018 17:11

Вы загружаете классы, а не студентов. Вам нужно либо запустить ленивую загрузку (как с receivedClass.Students), либо использовать Classes.Include(x => x.Students).SingleAsync(x => x.ClassId == classId);

Camilo Terevinto 03.11.2018 17:12

С class1.Students.Add(student1); я пытаюсь добавить ученика в Коллекцию учеников класса 1

Fihii 03.11.2018 17:14

@Llazar Забудь об этом. Проблема вовсе не в экономия данных. Проблема в том, как OP - это загрузка данные

Camilo Terevinto 03.11.2018 17:15

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

Llazar 03.11.2018 17:27

@Camilo Terevinto Я использовал второй вариант, который вы указали, и он сработал, спасибо

Fihii 03.11.2018 17:27

Разве ленивая загрузка не включена по умолчанию в EF? Или они изменили это с тех пор, как я стал разработчиком Scala?

Aron 03.11.2018 18:20

Да я думаю это

Fihii 03.11.2018 18:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
12
580
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, вы ищете .Включают(). Есть несколько разных стратегий для загрузка связанных сущностей.

using (var context = new DatabaseContext())
{
    // Load all students and related classes
    var classes1 = context.Classes
                    .Include(s => s.Students)
                    .ToList();

    // Load one student and its related classes
    var classt1 = context.Classes
                   .Where(s => s.Name == "someClassName")
                   .Include(s => s.Students)
                   .FirstOrDefault();

    // Load all students and related classes  
    // using a string to specify the relationship
    var classes2 = context.Classes
                    .Include("Students")
                    .ToList();

    // Load one student and its related classes  
    // using a string to specify the relationship
    var class2 = context.Classes
                   .Where(s => s.Name == "someName")
                   .Include("Students")
                   .FirstOrDefault();
}

Другие вопросы по теме