C# 使用语句和实体框架

C# 使用语句和实体框架,c#,entity-framework,C#,Entity Framework,只要我不使用注释掉的using语句,下面的代码就可以工作。使用using I get时,操作无法完成,因为DbContext已被释放 我最初的预感是,Using是在LINQ查询之后处理DbContext的,但我在将.Dipose放在finally块中时遇到了相同的错误 这是怎么回事?我已经有一段时间没有在C语言中工作了,所以我可能错过了一些简单的东西。LINQ提供程序使用的实体框架。这意味着在迭代IQueryable之前,不会在数据库上执行查询 所发生的事情是,在您的上下文被释放之后,某个东西会

只要我不使用注释掉的using语句,下面的代码就可以工作。使用using I get时,操作无法完成,因为DbContext已被释放

我最初的预感是,Using是在LINQ查询之后处理DbContext的,但我在将.Dipose放在finally块中时遇到了相同的错误


这是怎么回事?我已经有一段时间没有在C语言中工作了,所以我可能错过了一些简单的东西。

LINQ提供程序使用的实体框架。这意味着在迭代IQueryable之前,不会在数据库上执行查询

所发生的事情是,在您的上下文被释放之后,某个东西会迭代您的queryable,从而导致它尝试执行数据库查询

您可以通过调用ToList强制它立即执行


LINQ提供程序使用的实体框架。这意味着在迭代IQueryable之前,不会在数据库上执行查询

所发生的事情是,在您的上下文被释放之后,某个东西会迭代您的queryable,从而导致它尝试执行数据库查询

您可以通过调用ToList强制它立即执行

+1 ti@jrummell。出现该错误的原因是,当using中声明的变量离开该作用域时,会对其调用.Dispose,从而释放DbContext

如果以后尝试执行,DbContext将不再存在。

+1 ti@jrummell。出现该错误的原因是,当using中声明的变量离开该作用域时,会对其调用.Dispose,从而释放DbContext


如果以后尝试执行,DbContext将不再存在。

谢谢,成功了。是否存在导致执行但返回IQueryable类型集合的等效方法?或者我必须将返回的列表转换回IQueryable吗?我不这样认为。我倾向于认为IQueryable是一个未执行的查询,因此我认为它是合适的。其他将执行IQueryable查询的方法有,等等。谢谢,完成了。是否存在导致执行但返回IQueryable类型集合的等效方法?或者我必须将返回的列表转换回IQueryable吗?我不这样认为。我倾向于认为IQueryable是一个未执行的查询,因此我认为它是合适的。执行IQueryable查询的其他方法有,等等。您确定在这里适用吗?原始代码仍然在使用{}的上下文中;更像是由于延迟执行而尚未创建DbContext。@Jelling:他返回IQueryable,因此可能有人在using语句的上下文之外对其进行了迭代。您确定这在这里适用吗?原始代码仍然在使用{}的上下文中;更像是由于延迟执行而尚未创建DbContext。@Jelling:他返回IQueryable,因此可能有人在using语句的上下文之外对其进行了迭代。
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;
        }
    //}
}
var dto = questions.Project().To<DTOs.FormQuestionDTO>().ToList();