C# 导航属性在插入后返回null

C# 导航属性在插入后返回null,c#,.net,entity-framework,C#,.net,Entity Framework,我已将我的应用程序从EF4迁移到EF5。 我将下面的代码与以前的版本一起使用,以获取新添加项的相关实体 Student s = new Student(); s.Name = _name; s.ClassID = _cID; db.Students.Add(s); db.SaveChanges(); ClassRoom c = s.ClassRoom; 因此,我通常将特定的类实体设置为c。但是现在s.chourse返回null 如何为学生获取教室实体?是否必须使用db.questions.

我已将我的应用程序从EF4迁移到EF5。 我将下面的代码与以前的版本一起使用,以获取新添加项的相关实体

Student s = new Student();
s.Name = _name;
s.ClassID = _cID;

db.Students.Add(s);
db.SaveChanges();

ClassRoom c = s.ClassRoom;
因此,我通常将特定的类实体设置为
c
。但是现在
s.chourse
返回null


如何为学生获取
教室
实体?是否必须使用db.questions.FirstOrDefault(..)?

问题是您尚未加载导航属性

您可以使用:

db.Students.Include("ClassRoom")

急切地加载导航属性

另一个选项是通过将导航属性标记为virtual来启用延迟加载。我个人更喜欢前者(急切加载),因为它鼓励更高性能的代码

也可以在这里查看我的导航属性文章,我将在开始时讨论加载

您的代码应如下所示:

Student s = new Student();
s.Name = _name;
s.ClassID = _cID;

db.Students.Add(s);
db.SaveChanges();

//reload the entity from the DB with its associated nav property
s = db.Students.Include(s=>s.ClassRoom).Single(st=>st.StudentId == s.StudentId);
ClassRoom c = s.ClassRoom;

它是用EF5引入的吗?@LibinTK我想它是从EF一开始就存在的。@OndrejJanacek是的。。我以前见过。但是,即使没有db.Students.Include(“教室”)@LibinTK with code-first延迟加载在您没有虚拟属性时也会被禁用。我相信,如果您从modelbuilder生成上下文,默认情况下会启用它。启用延迟加载后,您将不会看到此问题。@LukeMcGregor在我的上下文中如何使用它
var e=db.Students.Include(“教室”).FirstOrDefault(p=>p.ClassID==s.ClassID)
Student s = new Student();
s.Name = _name;
s.ClassID = _cID;

db.Students.Add(s);
db.SaveChanges();

//reload the entity from the DB with its associated nav property
s = db.Students.Include(s=>s.ClassRoom).Single(st=>st.StudentId == s.StudentId);
ClassRoom c = s.ClassRoom;