访问与实体框架的关系关系

时间:2009-09-13 16:42:02

标签: entity-framework

我在学校课上我有这段代码:

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

学生班有两种关系:教师和学校。在学校课堂上,我试图找出所有教师都有特定身份的学生。

问题是我得到了

  

System.NullReferenceException:未将对象引用设置为对象的实例。

在声明中

student.Teacher.Id

我想过这样做.Students.Include(“老师”),但是这个。学生没有这样的方法。任何想法如何执行该查询?

3 个答案:

答案 0 :(得分:0)

Include子句可用于linq到实体查询。例如:

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

我想这就是这个。学生已经把收藏品拉进了记忆库,所以你可能会在你从dbs中检索学生的部分考虑这个代码。如果您想稍后加载学生的教师(非常重要的是ObjectContext跟踪学生实体!),您可以在TeacherReference属性上使用Load方法,但是对于this.Students集合中的每个学生分别使用:

student.TeacherReference.Load();

希望这有帮助

答案 1 :(得分:0)

您显示以下代码行:

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。在这种情况下,您不会包含Include。如果是这种情况,那么this.Sbudents来自哪里?

答案 2 :(得分:0)

我发现调试器让我走遍查询的每次迭代:

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

并且它不仅停止了崩溃,而且它也运行良好(所有学生都按预期选择)。我不完全确定原因。