我确信在实体框架上发出FirstOrDefault()
将对数据库发出查询并点击缓存我可以使用.Find()
。
但是帮助同事调试EF4.2
中的问题(查询数据没有反映db数据,查询不在sql profiler中)让我进入了solution。因此,请使用“.AsNoTracking()
”,之后我发现其他帖子here表明:
“以下有时从EF缓存中提取”: .FirstOrDefault();
另一篇同样问题的帖子:here
如果你去msdn:
默认情况下,在查询结果中返回实体时,就在EF实现它之前,ObjectContext将检查具有相同键的实体是否已加载到其ObjectStateManager中。如果具有相同键的实体已存在,则EF将其包含在查询结果中。尽管EF仍将针对数据库发出查询,但此行为可以绕过实现多次实体化的大部分成本。 .........
与常规查询不同,DbSet中的Find方法(包括的API) EF 4.1中的第一次将在偶数之前在内存中执行搜索 对数据库发出查询。
那么EF对象缓存如何表现?
.FirstOrDefault()
时总是点击数据库,但有时只能使用(黑盒子),所以最好还是使用.AsNoTracking().FirstOrDefault()
才能确定?First()
,Single()
,SingleOrDefault()