2011-03-18 82 views
0

嗨,你能帮我解决这个错误吗?
Cannot access a disposed object. Object name: 'DataContext accessed after Dispose.'.无法访问处置对象

在我的GUI

private void InitializePage() 
    { 
     cbCategory.DataSource = stock.StockCategory.Get(); 

    } 

在数据模型

public IEnumerable<StockCategory> Get() 
    { 
     using (leDataContext db = new leDataContext()) 
     { 
      try 
      { 
       var r = from s in db.StockCategories 
         select s; 
       return r; 
      } 
      catch (Exception ex) 
      { 
       Logger.Error(typeof(StockCategory), ex.ToString()); 
       throw; 
      } 

     } 

    } 
+0

它的工作原理如果我(从s在db.StockCategories中选择s).Tolist()。但把Tolist()放在那里,但是返回为ienumerable()是否正确? – VeecoTech 2011-03-18 09:29:22

+0

一旦处置它就可以访问处置的物体吗? – 2011-03-18 09:29:48

+0

这篇文章太糟糕了。代码片段丢失了,你没有描述你想要完成的事情,那么我们如何来帮助你呢?请纠正这些问题,然后我们将能够给你一些建议。 – Pako 2011-03-18 09:30:33

回答

12

你处置的DataContext,但返回的东西,仍然依赖于它。

选项:

  • 请勿将DataContext。我知道这听起来很奇怪,但是LINQ to SQL团队(以及Matt Warren)的指导已经表明,在大多数的情况下(即如果你没有做任何与众不同的事情)不需要处置
  • 致电ToList()里面Get()方法的using块。

请注意,仅使用退化查询使用查询表达式是没有意义的。 (如果这是你自己的代码中,甚至隐含Select(s => s)实际上不会有帮助。)

我建议改变你的方法:

public IList<StockCategory> GetAllStockCategories() 
{ 
    using (leDataContext db = new leDataContext()) 
    { 
     return db.StockCategories.ToList(); 
    } 
} 
4

因为延迟加载那里,查询ISN在linq语句行上没有真正执行。它在你循环时执行,或者在这种情况下 - 当你运行ToList时执行它。

当它被执行时,它必须在数据上下文内......在这里不是这种情况。您可以从Get方法返回List或将cbCategory.DataSource值的设置插入using (leDataContext...)范围。