我正在使用ASP.Net / WebForms / Entity Model / Framework 3.5
这是我项目的简单结构 表格> BLL> DAL(使用实体模型)
这是我的DAL代码段
public class MyDAL : IDisposable
{
private MyEntities db;
public BaseDAL()
{
db = new MyEntities();
}
public User GetUserByID(int userId)
{
try
{
IQueryable<User> 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_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;
}
当颂歌上线objUser.User_GroupReference.Load();
时,我得到了这个例外
ObjectContext实例已被释放,无法再使用 对于需要连接的操作。
如何解决这个问题?如果我在DAL的dispose方法中没有db.Dispose();
,它可以正常工作,没有例外。但是如果我不在那里处理db对象,那么&amp;我应该在哪里处理它?
以及如何在处置对象上下文后访问引用键?
答案 0 :(得分:2)
引发异常是因为在访问该导航属性时会触发延迟加载,但延迟加载仅在用于加载实体的上下文范围内有效。如果你处理上下文,你将失去延迟加载能力。在上下文处理之后无法使用延迟加载(除了将实体附加到新上下文之外,但只有在将其与原始上下文分离之后它才会起作用)。
在您的架构中,您必须使用Include
显式加载上层所需的每个关系。如果要使用延迟加载,则上下文必须在请求的整个持续时间内存在。对于Web表单,可以在BeginRequest
和EndRequest
事件处理程序中处理,您可以在BeginRequest
中创建上下文并将其置于EndRequest
中。上下文将存储在HttpContext.Items
中。你应该从这个集合中获取上下文(你可以为它创建帮助方法)并将它传递给BLL的构造函数,然后BLL将它传递给DAL。不要从BLL或DAL访问HttpContext.Items
。