LINQ 2 SQL查询ObjectDisposedException

时间:2009-12-16 12:20:40

标签: linq-to-sql c#-3.0

今天我的这个是一个奇怪的。

我在汇编方法中有这个查询。

        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 []时,序列化程序再次尝试访问DataContext,并且我得到一个无法访问已处置对象的异常。

在没有using()语句的情况下尝试并按照它应该的方式工作。但是,为什么我会这样做? 任何人都可以解释为什么在我调用.ToArray()并为内容分配新变量时仍然保留延迟加载?

1 个答案:

答案 0 :(得分:1)

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 {<1>}之后 之前。重点是:序列化需要这些数据,因此要么a:确保它被加载,要么b:将它从序列化中排除。