Я создаю приложение MVC 2 и использую linq to sql с сохраненными процессами.
Я создал слой доступа к данным, который имеет внутренний класс datacontext и открытый класс, который я предоставляю приложениям. В моем общедоступном классе я предоставляю методы, которые обращаются к классу 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 будет перебирать результаты. Я обнаружил, что всегда получаю сообщение об ошибке «datacontext вызывает недопустимую попытку вызова Read, когда читатель закрыт», потому что я оборачиваю использование контекста данных в область использования. Если я не определяю все в предложении использования, он работает нормально. Почему это?
Я думаю это не обязательно вещь linq или mvc (но не знаю наверняка), вызывает ли использование утверждение, вызывающее dispose, прежде чем все объекты будут возвращены? Или, может быть, предложение select выполняется только во время итерации перечислителя, аналогично тому, как работает yield?