2011-05-16 75 views
5

我使用这里所描述的方式,实体框架: Entity framework uses a lot of memoryObjectContext的实例已配置

我意识到我需要使用“使用”的声明,以工作正确。 当我做:

   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. 

我在做什么错?

回答

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做的,什么是应该做的。每次访问时是否应该创建一个新对象?它应该保留一个参考,除非它被处置?这并不明显,您可能会对此感到困惑。

+0

您可以在问题的链接中看到源代码。在Ladislav Mrnka的回答中,他发现了这种情况,你可以阅读我写给他的评论 - 我熟悉任何帮助。 – Naor 2011-05-16 16:15:42

+0

为什么你使用'Hashtable's呢?你需要决定:每次你想查询某个东西时,你应该创建一个新的工作单元(与ObjectContext一对一),或者每次使用后不应该“处理”它。哪个更适合你? – 2011-05-16 17:27:10

+0

如果我不会处理UnitOfWork/Context,它会保存很多对象,并对性能产生影响。我对吗? – Naor 2011-05-16 18:32:08

1

好了,错误本身就说明。在您的“全球”背景下处置任何**using** (IUnitOfWork uow = UnitOfWork.Current)后。所以任何尝试访问它都会导致错误。

+0

但为什么它配置?我没有在“使用”结束之前处理它。你能告诉我在我的代码中如何处置它吗? – Naor 2011-05-16 10:48:27

+0

“using”构造它只是try-catch-finally块的“语法糖”,终于有block包含调用var.Dispose(); - 看到:http://msdn.microsoft.com/en-us/library/yh598w02.aspx – 2011-05-16 10:52:30

+1

我明白,但这样做的时候这一点:m_AllAccounts = rep.GetQuery()选择(X =>新帐户(X)。 ).ToList();我得到例外 - 在它到达最后部分之前。那么如何处理前后的情况? – Naor 2011-05-16 11:08:42

1

我猜你ObjectContext达到您的using声明之前布置。您链接的问题显示您存储在HttpContext.ItemsHashTable中的上下文。如果包裹UnitOfWork.Current所有来电通过using仅第一块将工作 - 所有其他将HttpContextHashTable得到处置方面。

+0

我认为你是对的,因为只有第一个调用工作,并且之后,处置的上下文仍然在HashTable中。我正在考虑在处理它之后将Context设置为null,这样UnitOfWork将从Hushtable中获得null,并创建一个新的,但我认为这是一种解决方法,而不是解决方案。你认为我应该从哈希表中删除当前的UnitOfWork? – Naor 2011-05-16 16:14:01

相关问题