У меня есть 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;
}
}
Я хотел бы знать, как я могу добавить объект в коллекцию другого объекта, а затем иметь возможность также получить объект с содержимым в коллекции
Я пробовал, но результат тот же
Какую версию EF вы используете.
Я использую версию EF 6.2.0
Я думаю, что этот class1.Students.Add(student1); не нужен, потому что вы добавляете студентов с context.Students.Add(student1);. И вам нужно добавить SaveChanges после.
Вы загружаете классы, а не студентов. Вам нужно либо запустить ленивую загрузку (как с receivedClass.Students), либо использовать Classes.Include(x => x.Students).SingleAsync(x => x.ClassId == classId);
С class1.Students.Add(student1); я пытаюсь добавить ученика в Коллекцию учеников класса 1
@Llazar Забудь об этом. Проблема вовсе не в экономия данных. Проблема в том, как OP - это загрузка данные
О да, я понял. Предположим, что в проекте есть другие файлы, я подумал, что проблема.
@Camilo Terevinto Я использовал второй вариант, который вы указали, и он сработал, спасибо
Разве ленивая загрузка не включена по умолчанию в EF? Или они изменили это с тех пор, как я стал разработчиком Scala?
Да я думаю это





Я думаю, вы ищете .Включают(). Есть несколько разных стратегий для загрузка связанных сущностей.
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();
}
Вам нужен
SavaChanges()в классе инициализатора.