我正在构建一个 MVC 2 应用程序并使用带有存储过程的 linq to sql。
我创建了一个数据访问层,它有一个内部数据上下文类和一个公开应用程序的公共类。在我的公共类中,我公开了访问 datacontext 类并使用 linq 将数据转换为我自己的对象模型类的方法。
在我的公共课程中,我将使用以下模式公开一个方法:
public IEnumerable<MyObject> ListObjects(int iParameter)
{
using (MyDataContext db = new MyDataContext)
{
//call stored proc and convert results to my object model
return db.List_Objects().Select(o => new MyObject()
{
ID = o.ID,
Name = o.Name
Text = o.Code + " " + o.Description
};
}
}
我的 MVC 应用程序将从模型类调用此方法,并且 aspx 将遍历结果。我发现我总是收到错误“数据上下文导致读取器关闭时调用读取无效”,因为我将数据上下文使用包装在使用范围内。如果我不在 using 子句中列出所有内容,它就可以正常工作。为什么是这样?
我认为这不一定是 linq 或 mvc 的事情(但不确定),是 using 子句导致在所有对象返回之前调用 dispose 吗?或者也许 select 子句仅在枚举器被迭代时执行,类似于 yield 的工作方式?