已经处理了ObjectContext实例

时间:2011-05-16 10:26:48

标签: c# .net entity-framework

我按照这里描述的方式使用实体框架: 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 个答案:

答案 0 :(得分: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 :(得分:1)

嗯,这个错误不言而喻。在您的**using** (IUnitOfWork uow = UnitOfWork.Current)任何“全局”背景被处置之后。因此,任何访问它的尝试都会导致错误。

答案 2 :(得分:1)

我猜ObjectContext在您到达using声明之前已经处理好了。您关联的问题表明您将上下文存储在HttpContext.ItemsHashTable中。如果您通过UnitOfWork.Current将所有来电包裹到using,则只有第一个阻止有效 - 所有其他阻止来自HttpContextHashTable