C# 实体框架-在处理实体对象上下文后加载引用键

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

我使用的是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 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;
    }