C# 实体框架-在处理实体对象上下文后加载引用键
我使用的是ASP.Net/WebForms/Entity Model/Framework 3.5 这是我的项目的简单结构 表单>BLL>DAL(使用实体模型) 这是我的达尔的片段C# 实体框架-在处理实体对象上下文后加载引用键,c#,asp.net,entity-framework,dispose,C#,Asp.net,Entity Framework,Dispose,我使用的是ASP.Net/WebForms/Entity Model/Framework 3.5 这是我的项目的简单结构 表单>BLL>DAL(使用实体模型) 这是我的达尔的片段 public class MyDAL : IDisposable { private MyEntities db; public BaseDAL() { db = new MyEntities(); } public User GetUserByID(int u
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();
}
}
我使用block通过调用DAL,因此在BLL返回用户对象后,MyDAL的Dispose事件将立即触发。因此,此时将释放ObjectContext实例
现在在我的Web表单中,我像这样调用此函数以获取用户信息和组详细信息,这是用户表中用户组表的外键
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对象,我应该在何时何地处理它?
以及如何在释放对象上下文后访问引用键?会触发异常,因为当您访问该导航属性时会触发延迟加载,但延迟加载仅在用于加载实体的上下文范围内工作。如果您处理上下文,您将失去延迟加载能力。没有办法在处理上下文后使用延迟加载(除了将实体附加到新上下文,但只有在处理之前将其与原始上下文分离时,它才会起作用)
在您的体系结构中,您必须使用Include
来显式加载上层所需的每个关系。如果您想使用延迟加载,那么您的上下文必须在整个请求期间有效。对于web表单,它可以在BeginRequest
和EndRequest
事件处理程序中处理,您可以在BeginRequest
中创建上下文,并在EndRequest
中处理。上下文将存储在HttpContext.Items
中。您应该从这个集合中获取上下文(您可以为其创建helper方法),并将其传递给BLL的构造函数,后者将反过来将其传递给DAL。不要访问BLL或DAL的HttpContext.Items
。谢谢您的回复@Ladislav Mrnka
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;
}