1

using次のコードは、コメント アウトされたステートメントを使用しない限り機能します。私が使うとき、私はusing得るThe operation cannot be completed because the DbContext has been disposed

public IQueryable<DTOs.FormQuestionDTO> GetForm(int id, int page = 0)
{
    // FS stores pages starting with 1
    page = page == 0 ? 1 : page;

    //using (var db = new Models.FormEntities())
    //{
        var db = new Models.FormEntities();

        var questions = from fq in db.FormQuestions
                        join q in db.Questions on fq.QuestionId equals q.QuestionId
                        where (fq.FormId == id) && (fq.PageNumber == page) && fq.Disabled == false
                        orderby fq.DisplayOrder
                        select new { q.QuestionId, q.QuestionText, fq.DisplayOrder, fq.PageNumber };

        var dto = questions.Project().To<DTOs.FormQuestionDTO>();

        if (questions == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        else 
        {
            return dto;
        }
    //}
}

DbContext私の最初の予感は、LINQクエリの直後にUsingが破棄されているということでしたが、ブロックの.Dipose()中に入れたときに同じエラーが発生しました。finally

何が起きてる?私はしばらく C# を使っていないので、単純なものが欠けている可能性があります。

4

2 に答える 2

5

Entity Framework LINQ プロバイダーは、遅延実行を使用します。これは、IQueryable が繰り返されるまで、データベースでクエリが実行されないことを意味します。

何が起こっているかというと、コンテキストが破棄された後、何かがクエリ可能を反復し、データベース クエリを実行しようとします。

を呼び出して、すぐに実行するように強制できますToList()

var dto = questions.Project().To<DTOs.FormQuestionDTO>().ToList();
于 2012-12-11T18:50:44.900 に答える
0

+1 ti @jrummell. そのエラーが発生する理由usingは、で宣言された変数がそのスコープを離れると、.Dispose() が呼び出され、DbContext が解放されるためです。

後で実行しようとすると、DbContext は存在​​しなくなります。

于 2012-12-11T18:54:09.210 に答える