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;
        }
    //}
}

我最初的预感是 Using 正在处理DbContextLINQ 查询之后的右侧,但是在放入块.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 提@jrummell。您收到该错误的原因是,当声明的变量using离开该范围时,会调用 .Dispose() 来释放 DbContext。

如果您稍后尝试执行,则 DbContext 不再存在。

于 2012-12-11T18:54:09.210 回答