EF Dbcontext 是否会查询已加载到上下文中的实体?
Will EF Dbcontext query for an entity that's already been loaded into the context?
我首先使用 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 个查询。
您使用错误的方法来查找实体已经加载通过你的 DbContext
.
您必须使用 Find(formId)
,而不是使用 FirstOrDefault(x => x.Id == formId)
。 Find
方法将查看上下文以检查是否已加载与您要查找的类型和键相同的实体:
- 如果它找到它,那么 SQL 查询将不会发送到您的数据库
- 如果没有,那么它将访问数据库并加载您的实体
我首先使用 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 个查询。
您使用错误的方法来查找实体已经加载通过你的 DbContext
.
您必须使用 Find(formId)
,而不是使用 FirstOrDefault(x => x.Id == formId)
。 Find
方法将查看上下文以检查是否已加载与您要查找的类型和键相同的实体:
- 如果它找到它,那么 SQL 查询将不会发送到您的数据库
- 如果没有,那么它将访问数据库并加载您的实体