Невозможно получить доступ к удаленному объекту - PullRequest
0 голосов
/ 18 марта 2011

Привет, не могли бы вы помочь мне с этой ошибкой?
Cannot access a disposed object. Object name: 'DataContext accessed after Dispose.'.

в моем графическом интерфейсе

 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 ]

12 голосов
/ 18 марта 2011

Вы избавляетесь от DataContext, но возвращаете что-то, что все еще зависит от него.

Параметры:

  • Не выбрасывайте DataContext. Я знаю, это звучит странно, но руководство от команды LINQ to SQL (ну, Мэтт Уоррен) указало, что в большинстве дел (то есть, если вы не делаете ничего необычного) удаление не требуется
  • Вызов ToList() внутри блока using метода Get().

Обратите внимание, что использование выражения запроса только с вырожденным запросом является достаточно бессмысленным. (Если это в вашем собственном коде, даже неявное Select(s => s) на самом деле не будет полезным.)

Я бы предложил изменить ваш метод на:

public IList<StockCategory> GetAllStockCategories()
{
    using (leDataContext db = new leDataContext())
    {
        return db.StockCategories.ToList();
    }
}
4 голосов
/ 18 марта 2011

Из-за отложенной загрузки запрос фактически не выполняется в строке оператора linq. Он выполняется, когда вы зацикливаетесь на нем, или в этом случае - когда вы запускаете ToList для него.

Когда он выполняется, он должен находиться внутри контекста данных ... что здесь не так. Вы можете либо вернуть List из метода Get, либо вставить значение параметра cbCategory.DataSource в область действия using (leDataContext...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...