LINQ 2 SQL Query ObjectDisposed Исключение - PullRequest
1 голос
/ 16 декабря 2009

Это то, что у меня было сегодня, странное.

У меня есть этот запрос в методе сборки.

        public Order[] SelectAllOrders()
    {
        Order[] orders;
        using (MyDataContext context = new MyDataContext())
        {
            DataLoadOptions dlo = new DataLoadOptions();
            dlo.LoadWith<Order>(order => order.OrderDetails);
            context.LoadOptions = dlo;

            orders = context.Orders.Select(p => p).ToArray();
        }
        return orders;
    }

Предположим, я уже вызвал ToArray (), которую выполнила команда SQL, и дал мне нужные мне объекты, и я передал их новому массиву Order [], для которого не нужен экземпляр DataContext. Во время сериализации Order [], который я получаю из метода return, сериализатор снова пытается получить доступ к DataContext, и я получаю исключение, которое не может получить доступ к удаленному объекту.

Пробовал без оператора using () и работает как надо. Но почему я так поступаю? Кто-нибудь может объяснить, почему отложенная загрузка все еще остается, пока я вызываю .ToArray () и назначаю новую переменную с содержимым?

1 Ответ

1 голос
/ 16 декабря 2009

Select(p=>p) достигает очень мало; Вы можете просто позвонить:

orders = context.Orders.ToArray();

По поводу проблемы - я бы предположил, что либо OrderDetails действительно не загружен, либо он пытается загружать некоторые другие данные лениво. Я бы предложил провести расследование (в сеансе разработчиков):

    Order[] orders;
    using (MyDataContext context = new MyDataContext())
    {
        context.Log = Console.Out; // show me
        DataLoadOptions dlo = new DataLoadOptions();
        dlo.LoadWith<Order>(order => order.OrderDetails);
        context.LoadOptions = dlo;
        Console.WriteLine("> Calling ToArray");
        orders = context.Orders.ToArray();
        Console.WriteLine("> ToArray complete");

        // TODO: your extra code that causes serialziation, probably
        // involving `DataContractSerializer`

        Console.WriteLine("> Calling Dispose");
    }

При этом вы сможете увидеть любые дополнительные поездки в базу данных, которые будут счастливы после ToArray, но до Dispose(). Дело в том, что эти данные необходимы для сериализации, поэтому либо: убедитесь, что они загружены, либо b: исключите их из сериализации.

...