我按照这里描述的方式使用实体框架: 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.
我做错了什么?
答案 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.Items
或HashTable
中。如果您通过UnitOfWork.Current
将所有来电包裹到using
,则只有第一个阻止有效 - 所有其他阻止来自HttpContext
或HashTable
。