实体框架 - 在部署实体对象上下文后加载引用密钥

时间:2011-08-10 13:23:35

标签: c# asp.net entity-framework dispose

我正在使用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;我应该在哪里处理它? 以及如何在处置对象上下文后访问引用键?

1 个答案:

答案 0 :(得分:2)

引发异常是因为在访问该导航属性时会触发延迟加载,但延迟加载仅在用于加载实体的上下文范围内有效。如果你处理上下文,你将失去延迟加载能力。在上下文处理之后无法使用延迟加载(除了将实体附加到新上下文之外,但只有在将其与原始上下文分离之后它才会起作用)。

在您的架构中,您必须使用Include显式加载上层所需的每个关系。如果要使用延迟加载,则上下文必须在请求的整个持续时间内存在。对于Web表单,可以在BeginRequestEndRequest事件处理程序中处理,您可以在BeginRequest中创建上下文并将其置于EndRequest中。上下文将存储在HttpContext.Items中。你应该从这个集合中获取上下文(你可以为它创建帮助方法)并将它传递给BLL的构造函数,然后BLL将它传递给DAL。不要从BLL或DAL访问HttpContext.Items