无法访问已处置的对象

时间:2011-03-18 09:28:10

标签: c# linq-to-sql

你能帮我解决这个错误吗? Cannot access a disposed object. Object name: 'DataContext accessed after Dispose.'.

在我的GUI中

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

    }

在Datamodel

 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;
            }

        }

    }

2 个答案:

答案 0 :(得分:12)

您正在处置DataContext但返回仍然依赖它的内容。

选项:

  • 请勿丢弃DataContext。我知道这听起来很奇怪,但LINQ to SQL团队的指导(好吧,Matt Warren)已经指出,在大多数案例中(即如果你没有做任何不寻常的事情)处理不是需要
  • ToList()方法的Get()块中调用{/ 1}}

请注意,使用仅具有退化查询的查询表达式是毫无意义的。 (如果这在您自己的代码中,即使隐式using实际上也不会有用。)

我建议您将方法更改为:

Select(s => s)

答案 1 :(得分:4)

由于存在延迟加载,查询并未真正在linq语句行上执行。它在你循环时执行,或者在这种情况下 - 当你运行ToList时执行。

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