在退出包含 dbcontext 的方法之前,您必须调用 .ToList()。这将调用数据库并填写您的 Comment 类。否则,当您尝试在该方法之外“从对象中包含的对象中检索数据”并且尚未加载它们时,您将看到 DbContext 已被释放。这是因为 EF 正在尝试为这些项目再次“加载”或“调用数据库”。当然,由于您现在不在包含上下文的方法之外,因此 EF 无法加载它们。您应该阅读我认为默认打开的 EF 的“延迟加载”功能。
您可能想要创建一个只返回完全加载的 Comment 对象的方法。像这样的东西:
public class YourDbAccessClass {
public IEnumerable<Comment> GetCommentsByStudentId(int id) {
using (YourContextClass context = new YourContextClass()) {
// Eager load Student with the .Include() method.
var query = from comment in context.Comments.Include("Student")
where comment.StudentId == id
orderby comment.Created
select comment;
return query.ToList();
}
}
}
然后在您的调用代码中:
protected void ...some method on your view or asp page {
YourDbAccessClass db = new YourDbAccessClass();
var comments = db.GetCommentsByStudentId(yourIdVariableHere);
// Now you can loop through those items without dbcontext.
// Response.Write is probably a bad example, but you probably get the gist here.
foreach(var comment in comments) {
Response.Write("<li>" + comment.Student.Name + "</li>");
}
}