私は 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 スコープ内にラップしているため、「datacontext により、Reader が閉じられているときに無効な Read の呼び出しが試行されました」というエラーが常に発生することがわかりました。using 句ですべてを scpope しなければ、問題なく動作します。どうしてこれなの?
これは必ずしもlinqまたはmvcのことではないと思います(ただし、確かにはわかりません)、using句により、すべてのオブジェクトが返される前にdisposeが呼び出されますか?それとも、列挙子がyieldの仕組みと同様に反復されているときにselect句が実行されているだけでしょうか?