Показывать данные в одном представлении в рамках сущности .net отношения один-ко-многим - PullRequest
0 голосов
/ 12 ноября 2018

У меня в БД две таблицы: студент (много) и отдел (одна) и отношения один ко многим. Я хочу показать список с DepartmentName для каждого StudentName, но получаю эту ошибку: System.NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта.

Это мой код контроллера (код отлично работает для отношений один к одному):

        public ActionResult Index()
    {

        List<Students> studlist = db.Students.ToList();
        StudentViewModel studlistVM = new StudentViewModel();

        List<StudentViewModel> studlistVMList = studlist.Select(x => new StudentViewModel
        {
            StudID = x.StudID,
            StudName = x.StudName,
            DeptName = x.deptobj.DeptName


        }).ToList();


        return View(studlistVMList);
    }

1 Ответ

0 голосов
/ 12 ноября 2018

Увы, вы забыли показать нам свои занятия. Если вы следовали первым правилам кода инфраструктуры сущностей, у вас будут классы, подобные следующим:

class Department
{
    public int Id {get; set;}
    ...

    // Every department has zero or more Students (one-to-many)
    public virtual ICollection<Student> Students {get; set;}
}

class Student
{
    public int Id {get; set;}
    ...

    // every Student belongs to exactly one department, using foreign key
    public int DepartmentId {get; set;}
    public virtual Department Department {get; set;}
}

А твой DbContext

class UniversityContext : DbContext
{
     public DbSet<Department> Departments {get; set;}
     public DbSet<Student> Students {get; set;}
}

Это все, что нужно знать Entity Framework, чтобы идентифицировать ваши таблицы, столбцы в таблицах и отношение «один ко многим» между таблицами

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

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

Я хочу показать список с DepartmentName для каждого StudentName,

var result = universityDbContext.Students
    .Where(student => ...)                 // only if you don't want all Students
    .Select(student => new
    {
        // select only the properties you plan to use
        Id = student.Id,
        StudentName = student.Name,

        DepartmentName = student.Department.Name,
    });

Поскольку вы использовали student.Department, структура сущностей знает, что необходим SQL join.

Если вы хотите плоское соединение SQL, начните со стороны «многие» и используйте виртуальная собственность в сторону «один». Если вы хотите групповое объединение, начните с «одной» стороной и использовать виртуальную ICollection для «многих» сторона.

Вы хотели плоское соединение, но если бы вы хотели Departments with their Students, вы бы сделали что-то вроде:

var result = myDbContext.Departments
    .Where(department => ...)             // if you don't want all departments
    .Select(department => new
    {
        // select only the properties you plan to use
        Id = department.Id,
        Name = department.Name,

        StudentsWithHighGrades = department.Students
            .Where(student => student.Grade >= ...)
            .Select(student => new
            {
                Id = student.Id,
                Name = student.Name,
                Grade = student.Grade,
                ...
            })
            .ToList();
    });
...