首页 文章

已经处理了ObjectContext实例

提问于
浏览
5

我按照这里描述的方式使用实体框架:Entity framework uses a lot of memory

我意识到我需要使用“using”语句才能正常工作 . 我在做的时候:

using (IUnitOfWork uow = UnitOfWork.Current)
                {
                    CompanyRepository rep = new CompanyRepository();
                    m_AllAccounts = rep.GetQuery().
                        Select(x => new Account(x)).ToList(); ///HERE I GET THE EXCEPTION
                }

对于这个例子,我得到:

The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

我究竟做错了什么?

3 回答

  • 1

    我猜 ObjectContext 在你达到 using 陈述之前就被处理了 . 您链接的问题表明您将上下文存储在 HttpContext.ItemsHashTable 中 . 如果您通过 using 将所有调用包装到 UnitOfWork.Current ,则只有第一个块可以正常工作 - 所有其他将从 HttpContextHashTable 获得处置上下文 .

  • 2

    我可能错了,但是我想到的第一件事就是 UnitOfWork.Current 可能会返回已经处理好的工作单元 .

    想象一下以下代码:

    void MethodA ()
    {
        using (IUnitOfWork uow = UnitOfWork.Current)
        {
            // do some query here
        }
    }
    
    void MethodB ()
    {
        using (IUnitOfWork uow = UnitOfWork.Current)
        {
            // do another query here
        }
    }
    
    MethodA (); // works OK
    // now UnitOfWork.Current is disposed
    MethodB ();  // raises exception
    

    问题归结为 UnitOfWork.Current 到底是做什么以及应该做什么 . 它应该在每次访问时创建一个新对象吗?它应该保留参考,除非它被处置?这并不明显,你可能会对此感到困惑 .

  • 1

    嗯,错误说明了一切 . 在您的任何 **using** (IUnitOfWork uow = UnitOfWork.Current) 之后,您的"global"上下文被处理掉 . 因此,任何访问它的尝试都将导致错误 .

相关问题