Ядро на Entity Framework: Как да включите нулев свързан обект с неговите свойства на нулева колона?

Работя по проект, който използва EF Core и .Net Core.

Имам 2 класа Entity. Те са връзки "един към много". Нека кажем „Ученик“ N ‹-----› 1 „Оценка“.

public class Student{
  public string Id {get;set;}
  public string Name {get;set;}
  public string GradeId {get;set;}
  public Grade grade {get;set;}
}

public class Grade{
  public string Id {get;set;}
  public string StudentGrade {get;set;}
}

Моят LINQ to eager зарежда студент по този начин

_dbcontext.Student.Include(s => s.Grade).ToList();

Понякога създавам запис на ученик, но не задавам оценка за него. В резултат на това оценката ще бъде нула. Тъй като използвам WebAPI за тази задача, трябва да върна вложен JSON, който винаги включва Grade и неговите свойства, независимо дали Grade е null или не.


person MTLC    schedule 22.02.2021    source източник


Отговори (1)


Най-простото решение е да се инициализира свойство след материализиране:

var students = _dbcontext.Student
    .Include(s => s.Grade)
    .AsNoTracking()
    .ToList();

Grade emptyGrade = null;
foreach(var s in students)
{
   if (s.Grade == null)
   {
      emptyGrade ??= new Grade();
      s.Grade = emptyGrade;
   }
}

Има и друга опция с персонализирана проекция

var query = 
   from s in _dbcontext.Student
   select new Student
   {
       Id = s.Id,
       Name = s.Name,
       GradeId = s.GradeId,
       grade = s.grade ?? new Grade()
   };

var students = query.ToList();
person Svyatoslav Danyliv    schedule 22.02.2021
comment
Може би var emptyGrade = new Grade(); ? - person Serge; 22.02.2021
comment
Или може би var emptyGrade = new Grade { StudentGrade =No Grade}; ? - person Serge; 22.02.2021
comment
@Sergey Защо да въвеждате ненужни разпределения? - person Johnathan Barclay; 22.02.2021
comment
Харесва ми този отговор. @MTLC, мисля, че ключов момент с този отговор е, че оформянето на обекта за JSON всъщност не е грижа за EF (съхранение) и може да се направи след четене в EF обекта, което може да помогне за поддържането на слоевете разделени. - person Jamie F; 22.02.2021
comment
foreach(var s in students) s.Grade ??= new Grade() обаче би било достатъчно. - person Johnathan Barclay; 22.02.2021
comment
@Svyatoslav Danyliv: Благодаря ви много!!! Работи като чар. - person MTLC; 22.02.2021