实体框架-在处理实体对象上下文后加载引用键
本文关键字:实体 加载 引用 上下文 对象 框架 处理 | 更新日期: 2023-09-27 18:04:57
我使用的是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;
}
}
}
我使用block通过调用DAL,因此MyDAL的Dispose事件将在BLL返回User对象后不久触发。此时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实例已被处理,不能再使用对于需要连接的操作。
如何解决这个问题?如果我不做db.Dispose();
在我的DAL的处置方法,它工作得很好,没有异常出现。但是如果我不在那里处理db对象,当&我应该把它处理在哪里?以及如何在处置对象上下文后访问引用键?
这个异常会被触发,因为当你访问那个导航属性时延迟加载会被触发,但是延迟加载只在用来加载实体的上下文范围内工作。如果您处置上下文,您将失去延迟加载能力。在context dispose之后没有办法使用lazy loading(除非将实体附加到新的context中,但是只有在你将它从原始context中分离出来之后才会起作用)
在你的体系结构中,你必须使用Include
来显式加载你在上层需要的每个关系。如果你想使用延迟加载,你的上下文必须在整个请求期间存在。在web表单的情况下,它可以处理,例如在BeginRequest
和EndRequest
事件处理程序中,您在BeginRequest
中创建上下文并在EndRequest
中处理它。上下文将存储在HttpContext.Items
中。您应该从该集合中获取上下文(您可以为此创建helper方法)并将其传递给BLL的构造函数,后者将其传递给DAL。不要从BLL或DAL访问HttpContext.Items
。