EF Dbcontext是否会查询已加载到上下文中的实体?

时间:2016-02-23 20:46:00

标签: .net entity-framework ef-code-first

我首先使用EF代码启用了延迟加载和更改跟踪。我以为我已经阅读过,并且假设dbcontext不会为已经加载的实体运行SQL查询。这是我正在阅读的延迟加载文章的一部分,但这不适用于直接查询吗?

我有以下内容:

        // 1 query
        List<Form> forms = _formService.GetList();
        //1 query
        Form form = _formService.GetOne(x => x.Id == formId); 

该服务只是包含上下文,没有疯狂的伏都教在下面。在使用glimpse查看SQL。该页面注册了两个单独的查询,完全如上所示,尽管第一个查询包括第二个查询的POCO。 Glimpse是误导我,还是我误解了DBContext的工作方式?

编辑:上下文的范围限定为每个HTTP请求,因此我的API只有一个上下文。但是,为了确认Eric J提到的内容,我尝试了这段代码:

        DbContext db = new DbContext();
        List<Form> forms = db.Forms.ToList();
        Form form = db.Forms.FirstOrDefault(x => x.Id == formId);

为了确保我的API中没有问题,Glimpse仍然告诉我同样的事情。 2个查询。

1 个答案:

答案 0 :(得分:1)

您正在使用 错误的 方法查找DbContext已加载的实体。

您必须使用FirstOrDefault(x => x.Id == formId),而不是Find(formId)Find方法将查看上下文,以检查您正在查找的具有相同类型和密钥的实体是否已加载:

  • 如果找到,则不会将SQL查询发送到您的数据库
  • 如果没有,那么它将命中数据库并加载您的实体