ошибка при попытке получить "Grade" для StudentId = 1 - PullRequest
0 голосов
/ 02 марта 2019

У меня ниже сущности и класс контекста базы данных,

public class Grade
{
    public int Id { get; set; }
    public string GradeName { get; set; }

    public virtual ICollection<Student> Students { get; set; } = new HashSet<Student>();
}

public class Student
{
    public int Id { get; set; }
    public string StudentName { get; set; }
}



public class SchoolContext : DbContext
{
    public DbSet<Grade> Grades { get; set; }
    public DbSet<Student> Students { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(@"Server=(localdb)\MSSQLLocalDB;Database=SchoolDB;Trusted_Connection=True;");
    }
}

Получение ошибки ниже при выполнении кода ниже, что нужно сделать здесь.Спасибо!

Я ищу решение без добавления свойства оценки в классе ученика

System.InvalidOperationException: 'Лямбда-выражение свойства Include' x =>{из Студента c в x.Students, где ([c] .Id == __studentId_0) выберите [c]} 'недопустимо.Выражение должно представлять доступ к свойству: 't => t.MyProperty'.Чтобы нацелить навигацию, объявленную на производные типы, укажите лямбда-параметр с явно заданным типом целевого типа, например, «(Derived d) => d.MyProperty».Для получения дополнительной информации о включении связанных данных см. http://go.microsoft.com/fwlink/?LinkID=746393.'

static void Main(string[] args)
    {
        var studentId = 1;

        var context = new SchoolContext();
        var data = context.Grades.Include(x => x.Students.Where(c => c.Id == studentId)).SingleOrDefault();
    }

enter image description here

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Я ищу решение, не добавляя свойство Grade в классе Student

Итак, вы хотите получить Grade для Student, но нехотите добавить Grade свойство навигации к Student и позволить EF Core обрабатывать это естественно для вас?Другими словами, вы теряете одно из самых больших преимуществ ORM и начинаете искать решения SQL-ish для простых запросов, которые ORM может обрабатывать с помощью простого средства доступа к свойствам?

Есть способы сделать то, что вы хотите, но яЯ бы посоветовал сначала спросить себя, действительно ли вам это нужно.

В любом случае, одним из возможных решений является использование свойства навигации по коллекции с Any в качестве фильтра:

var studentGrade = context.Grades
    .FirstOrDefault(grade => grade.Students.Any(student => student.Id == studentId));

Другое - использованиеLINQ-эквивалент SQL-запроса:

var studentGrade = (
    from grade in context.Grades
    from student in grade.Students
    where student.Id == studentId
    select grade).FirstOrDefault();
0 голосов
/ 02 марта 2019

Нельзя включить свойство навигации по условию.Включить может только содержит лямбда-навигационные свойства без каких-либо условий.Чтобы решить вашу проблему, вы должны добавить свойство навигации Grade в класс Student и выбрать среди студентов, включая Grade.

public class Student
{
    public int Id { get; set; }
    public string StudentName { get; set; }
    public Grade StudentGrade { get; set; }
}

…
var data = context.Students.Include(x => x.Grade).Where(c => c.Id == studentId).SingleOrDefault();
...