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

本文关键字:实体 加载 引用 上下文 对象 框架 处理 | 更新日期: 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表单的情况下,它可以处理,例如在BeginRequestEndRequest事件处理程序中,您在BeginRequest中创建上下文并在EndRequest中处理它。上下文将存储在HttpContext.Items中。您应该从该集合中获取上下文(您可以为此创建helper方法)并将其传递给BLL的构造函数,后者将其传递给DAL。不要从BLL或DAL访问HttpContext.Items