Доступ к отношениям с помощью Entity Framework - PullRequest
0 голосов
/ 13 сентября 2009

В школьном классе у меня есть этот код:

from student in this.Students where student.Teacher.Id == id select student

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

Проблема в том, что я получаю

System.NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта.

в заявлении

student.Teacher.Id

Я думал об этом. Студенты. Инклюз («Учитель»), но у этого. У студентов нет такого метода. Любые идеи, как я могу выполнить этот запрос?

Ответы [ 3 ]

0 голосов
/ 14 сентября 2009

Вы показываете эту строку кода:

from student in this.Students where student.Teacher.Id = id select student

Во-первых, = должно быть ==

Это просто опечатка?

Во-вторых, вам не нужно включать для следующего исправленного запроса, если позже вы не разыграете Учителя:

var q = from student in SomeObjectContext.Students 
        where student.Teacher.Id == id 
        select student;

LINQ to Entities не требует Inlcude только для предложения where.

Вам будет необходимо включить, если вы позже итерировали результаты и разыменовали Учителя:

foreach (var student in q)
{
    Console.WriteLn(student.Teacher.Id);
}

В-третьих, вы показываете эту ошибку:

System.NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта.

Это не ошибка LINQ to Entities. Ошибка на самом деле в этой строке кода, или это где-то еще?

Кроме того, что такое this? Если это не ObjectContext, то вы, скорее всего, LINQ to Objects, а не LINQ to Entities. В этом случае у вас не было бы «Включить». Если это так, то откуда взялся this.Sbudents?

0 голосов
/ 14 сентября 2009

Я обнаружил, что отладчик позволяет мне проходить каждую итерацию запроса:

from student in this.Students where student.Teacher.Id == id select student

так что я должен увидеться с student.Teacher.Id == id много раз. Каждый раз, когда я отлаживал, этого не происходило, и все работало просто отлично. Я превратил выражение в:

from student in this.Students where student.Teacher != null && student.Teacher.Id == id select student

и он не только перестал сбой, но и работал нормально (все студенты были выбраны, как и ожидалось). Я не совсем уверен, почему.

0 голосов
/ 13 сентября 2009

Предложение «Включить» может использоваться в запросе linq to entity. Например:

using (YourDataContext db = new YourDataContext())
        {
            var query = from s in db.Students.Include("Teacher")
                        where s.Teacher.ID == 1
                        select s;
             //etc...
        }

Я полагаю, что this.Students уже собран в память, поэтому вы можете рассмотреть этот код в той части, которую вы извлекаете из базы данных. Если вы хотите позже загрузить Учителя ученика (очень важно, чтобы сущности учеников отслеживались ObjectContext!), Вы можете использовать метод Load для свойства TeacherReference, но для каждого учащегося в этой коллекции .Students отдельно:

student.TeacherReference.Load();

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...