Linq to SQL子表抛出数据上下文Dispose问题

时间:2016-05-10 19:53:51

标签: c# json asp.net-mvc asp.net-web-api linq-to-sql

我使用Linq to SQL类进行数据提取,并使用以下实体:

  • 客户 - >订单

客户和订单通过客户ID上的FK约束链接,并显示在具有该关系的.dbml文件中

当我通过intellisense访问对象属性时,我可以看到Customer.Name, Customer.Address等,但也可以看到链接的订单实体Customer.Orders

我的问题是,当我查询数据库以仅填充Customer实体并处置Datacontext时,我会收到错误

  

无法访问已处置的对象。对象名称:'访问DataContext   处理后。'。

public IEnumerable<Customer> GetCustomer(Int32 customerID)
        {
            // initialise
            Customer cust = new Customer();

           using (CustomerManager ctl = new CustomerManager())
            {
                // get customer, this returns a single customer entity
                // i.e. datacontext.Customers.Where(m=> m.CustomerID == customerID).FirstOrDefault();
                cust = ctl.SelectCustomer(customerID);

            }

            yield return cust;
}

我尝试将其更改为存储过程,即Customer_SelectResult,这非常合适。这是我使用表格的时候。

有没有办法阻止子表导致此问题?

提前致谢

2 个答案:

答案 0 :(得分:1)

在处理之前,您必须加载所有数据。有关解释,请参阅https://msdn.microsoft.com/en-us/library/bb399393(v=vs.110).aspx;有关解决方案,请参阅https://msdn.microsoft.com/en-us/library/bb386920(v=vs.110).aspx

产生结果会产生另一个问题,迭代结果时会在数据库上执行查询。见https://blogs.msdn.microsoft.com/charlie/2007/12/10/linq-and-deferred-execution/

答案 1 :(得分:0)

关键字using会自动在其中处理初始化对象。我想ctlGetCustomer被调用后被释放。所以你可以试试没有它:

CustomerManager ctl = new CustomerManager()
yield return ctl.SelectCustomer(customerID);