在单个请求中加载实体2次,似乎在第二次尝试时被缓存

时间:2014-01-13 22:46:38

标签: c# asp.net-mvc entity-framework

在同一个请求中,我正在加载一个实体2次:

IProduct product = ....

// some logic

IProduct product2 = ...

两次都使用完全相同的fetch方法,所以参数是相同的,默认情况下EF是否缓存数据而不进行另一次数据库调用?

如何强制EF再次获取数据并绕过它可能具有的任何缓存?

2 个答案:

答案 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();