Linq to SQL child table throwing Data Context Dispose 问题
Linq to SQL child table throwing Data Context Dispose issue
我正在使用 Linq to SQL 类 进行数据提取并具有以下实体:
- 客户 -> 订单
Customer 和 Order 通过 CustomerID 上的 FK 约束链接,并以该关系出现在我的 .dbml 文件中
当我通过智能感知访问对象属性时,我可以看到 Customer.Name, Customer.Address
等以及链接的订单实体 Customer.Orders
我的问题是,当我查询数据库以仅填充 Customer 实体并处理 Datacontext 时,出现错误
Cannot access a disposed object. Object name: 'DataContext accessed
after Dispose.'.
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
,并且效果非常好。就是我用表的时候。
有什么方法可以防止子表导致这个问题吗?
提前致谢
您必须先加载所有数据,然后再进行处理。请参阅 https://msdn.microsoft.com/en-us/library/bb399393(v=vs.110).aspx for an explanation and 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/
关键字using
自动释放其中的初始化对象。我想 ctl
是在调用 GetCustomer
之后处理的。所以你可以不用它试试:
CustomerManager ctl = new CustomerManager()
yield return ctl.SelectCustomer(customerID);
我正在使用 Linq to SQL 类 进行数据提取并具有以下实体:
- 客户 -> 订单
Customer 和 Order 通过 CustomerID 上的 FK 约束链接,并以该关系出现在我的 .dbml 文件中
当我通过智能感知访问对象属性时,我可以看到 Customer.Name, Customer.Address
等以及链接的订单实体 Customer.Orders
我的问题是,当我查询数据库以仅填充 Customer 实体并处理 Datacontext 时,出现错误
Cannot access a disposed object. Object name: 'DataContext accessed after Dispose.'.
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
,并且效果非常好。就是我用表的时候。
有什么方法可以防止子表导致这个问题吗?
提前致谢
您必须先加载所有数据,然后再进行处理。请参阅 https://msdn.microsoft.com/en-us/library/bb399393(v=vs.110).aspx for an explanation and 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/
关键字using
自动释放其中的初始化对象。我想 ctl
是在调用 GetCustomer
之后处理的。所以你可以不用它试试:
CustomerManager ctl = new CustomerManager()
yield return ctl.SelectCustomer(customerID);