插入后导航属性返回空值

5
我已将我的应用从EF4迁移到EF5。我使用了以下代码来获取先前版本中新添加项的相关实体。
Student s = new Student();
s.Name = _name;
s.ClassID = _cID;

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

ClassRoom c = s.ClassRoom;

我曾经通过 c 获取特定的班级实体。但现在 s.ClassRoom 返回 null。

我如何为学生获取 ClassRoom 实体?我是否必须使用 db.ClassRooms.FirstOrDefault(....)

1个回答

9
问题在于您还没有加载导航属性。您可以使用以下方法:
db.Students.Include("ClassRoom")

或者
using System.Data.Entity;
db.Students.Include(s=>s.ClassRoom)

要急切地加载导航属性,另一个选择是通过将导航属性标记为虚拟来启用惰性加载。个人而言,我更喜欢前者(急切加载),因为它鼓励编写更高效的代码。

此外,请查看我的导航属性文章,在这里我讨论了在开始时加载的内容http://blog.staticvoid.co.nz/2012/7/17/entity_framework-navigation_property_basics_with_code_first

您的代码应该如下所示:

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中引入的吗? - Libin TK
1
@LibinTK,我认为它从EF一开始就存在。 - Ondrej Janacek
1
@LibinTK,使用Code First时,如果没有虚拟属性,则禁用延迟加载。我相信如果您从ModelBuilder生成上下文,则默认情况下启用它。启用延迟加载后,您将不会遇到此问题。 - undefined
@LukeMcGregor 我该如何在我的上下文中使用它?var e = db.Students.Include("ClassRoom").FirstOrDefault(p=>p.ClassID==s.ClassID) - Libin TK
@LibinTK 是的,完全可以这样做,你也可以将此实体分配给导航属性并将其保存为设置s.ClassID = _cID;的替代方法。 - undefined
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接