entity framework – 在部署实体对象上下文后加载引用密钥

我正在使用ASP.Net / WebForms / Entity Model / Framework 3.5

这是我的项目的简单结构Forms> BLL> DAL(使用实体模型)

这是我的DAL的片段

public class MyDAL : IDisposable { private MyEntities db; public BaseDAL() { db = new MyEntities(); } public User GetUserByID(int userId) { try { IQueryable objUser = null; objUser = from res in db.Users where res.UserId == userId select res; return objUser.FirstOrDefault(); } catch { throw; } } public void Dispose() { db.Dispose(); } } 

我这样从我的BLL调用DAL的函数

 public class MyBLL { public User GetUserByID(int userId) { try { using (MyDAL objMyDAL = new MyDAL()) { return objMyDAL.GetUserByID(userId); } } catch { throw; } } } 

我通过使用块调用DAL,因此在BLL返回User对象后,MyDAL的Dispose事件将很快触发。 所以此时ObjectContext实例被释放了。

现在在我的Web窗体中,我调用此函数来获取用户信息和组详细信息,这是User表中user_Group表的外键

  protected void Page_Load(object sender, EventArgs e) { MyBLL objMyBll = new MyBLL(); User objUser = objMyBll.GetUserByID(123); objUser.User_GroupReference.Load(); // ERROR LINE int groupId = objUser.User_Group.Group_Id; } 

当ode上线objUser.User_GroupReference.Load(); 我得到了这个例外

ObjectContext实例已被释放,不能再用于需要连接的操作。

怎么解决这个? 如果我不做db.Dispose(); 在我的DAL的dispose方法中,它工作正常,没有例外。 但是如果我不在那里处理db对象,我应该何时何地处理它? 以及如何在处置对象上下文后访问引用键?

引发exception是因为在访问该导航属性时会触发延迟加载,但延迟加载仅在用于加载实体的上下文范围内有效。 如果你处理上下文,你将失去延迟加载能力。 在上下文处理之后无法使用延迟加载(除了将实体附加到新上下文之外,但只有在将其部署到原始上下文之前它才会起作用)。

在您的体系结构中,您必须使用Include显式加载上层所需的每个关系。 如果要使用延迟加载,则上下文必须在请求的整个持续时间内存在。 对于Web表单,可以在BeginRequestEndRequest事件处理程序中处理它,您可以在BeginRequest创建上下文并将其置于EndRequest 。 上下文将存储在HttpContext.Items 。 你应该从这个集合中获取上下文(你可以为它创建帮助方法)并将它传递给BLL的构造函数,然后BLL将它传递给DAL。 不要从BLL或DAL访问HttpContext.Items