在同一个请求中,我正在加载一个实体2次:
IProduct product = ....
// some logic
IProduct product2 = ...
两次都使用完全相同的fetch方法,所以参数是相同的,默认情况下EF是否缓存数据而不进行另一次数据库调用?
如何强制EF再次获取数据并绕过它可能具有的任何缓存?
答案 0 :(得分:1)
这取决于。
IProduct product = db.Find(key);
IProduct product2 = db.Find(key); // this will get a cached value only if db is the same instance
...默认情况下,当您在.Find
的一个实例上使用DbContext
时,这是唯一一次检索缓存版本的时间。 .Where
调用不会被缓存,每个调用都会生成一个新的SQL查询。因此,如果您想阻止缓存,请使用.Where(x => x.Id == key)
代替.Find(key)
。
答案 1 :(得分:1)
如果您使用相同的context
实例,那么AsNoTracking()
方法可能就是您要找的方法(here)
Context.Set<Product>().AsNoTracking().Where(x => x.whatever).ToList();