简体   繁体   中英

Using Statement and Entity Framework

The following code works as long as I don't use the commented out using statement. When I use using I get 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;
        }
    //}
}

My original hunch was that Using is disposing of the DbContext right after the LINQ query but I got the same error when putting the .Dipose() inside of a finally block.

What's going on here? I haven't worked in C# for a while so I'm probably missing something simple.

The Entity Framework LINQ provider uses deferred execution . This means that the query is not executed on the database until the IQueryable is iterated.

What's happening is that after your context is disposed, something iterates your queryable which causes it to try to execute the database query.

You can force it to execute immediately by calling ToList() .

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

+1 ti @jrummell. The reason you get that error is that, when the variable declared in using leaves that scope, .Dispose() is called on it which releases the DbContext.

If you later try to execute, the DbContext is no longer there.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM