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

75
8

У меня есть две таблицы в моей базе данных: студент (многие) и отдел (одна) и отношения один ко многим. Я хочу показать список с 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);
}

спросил(а) 2021-01-19T15:46:31+03:00 2 месяца, 3 недели назад
1
Решение
61

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

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();
});

ответил(а) 2021-01-19T15:46:31+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема