我首先使用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个查询。
答案 0 :(得分:1)
您正在使用 错误的 方法查找DbContext
已加载的实体。
您必须使用FirstOrDefault(x => x.Id == formId)
,而不是Find(formId)
。 Find
方法将查看上下文,以检查您正在查找的具有相同类型和密钥的实体是否已加载: