首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ObjectContext实例已被释放

ObjectContext实例已被释放
EN

Stack Overflow用户
提问于 2011-05-16 18:26:48
回答 3查看 2.1K关注 0票数 5

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

我意识到我需要使用"using“语句才能正确工作。当我这样做的时候:

代码语言:javascript
复制
                using (IUnitOfWork uow = UnitOfWork.Current)
                {
                    CompanyRepository rep = new CompanyRepository();
                    m_AllAccounts = rep.GetQuery().
                        Select(x => new Account(x)).ToList(); ///HERE I GET THE EXCEPTION
                }

在这个例子中,我得到了:

代码语言:javascript
复制
The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

我做错了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-16 20:16:55

我可能错了,但是我首先想到的是,UnitOfWork.Current可能会返回一个已经处理过的工作单元。

想象一下下面的代码:

代码语言:javascript
复制
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到底做了什么,应该做什么。它是否应该在每次访问时都创建一个新对象?它是否应该保留一个引用,除非它被释放?这并不明显,您可能会对此感到困惑。

票数 2
EN

Stack Overflow用户

发布于 2011-05-16 18:42:03

好吧,这个错误不言而喻。在您的任何**using** (IUnitOfWork uow = UnitOfWork.Current)之后,您的“全局”上下文被释放。因此,任何访问它的尝试都将导致错误。

票数 1
EN

Stack Overflow用户

发布于 2011-05-16 20:05:24

我猜在您到达using语句之前,ObjectContext已经被处理掉了。您的链接问题显示您将上下文存储在HttpContext.ItemsHashTable中。如果你用using包装了所有对UnitOfWork.Current的调用,那么只有第一个块会起作用--所有其他的调用都会从HttpContextHashTable中得到释放的上下文。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6016025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档