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

C# 在一个请求中加载实体2次,似乎在第二次尝试时被缓存,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,在同一请求中,我加载实体2次: IProduct product = .... // some logic IProduct product2 = ... 这两次都使用完全相同的fetch方法,因此参数相同,默认情况下EF是否缓存数据而不进行另一次数据库调用 如何强制EF再次获取数据并绕过它可能拥有的任何缓存?这取决于具体情况 IProduct product = db.Find(key); IProduct product2 = db.Find(key); // this will ge

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

IProduct product = ....

// some logic

IProduct product2 = ...
这两次都使用完全相同的fetch方法,因此参数相同,默认情况下EF是否缓存数据而不进行另一次数据库调用

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

这取决于具体情况

IProduct product = db.Find(key);
IProduct product2 = db.Find(key); // this will get a cached value only if db is the same instance

。。。默认情况下,当您在
DbContext
的一个实例上使用
.Find
时,这是它检索缓存版本的唯一时间<代码>。如果不缓存调用,则每个调用将生成一个新的SQL查询。因此,如果要阻止它缓存,请使用
。其中(x=>x.Id==key)
而不是
。查找(key)

如果使用相同的
上下文
实例,
AsNoTracking()
方法可能就是您要查找的()

Context.Set().AsNoTracking().Where(x=>x.whatever.ToList();

这在很大程度上取决于项目的配置细节以及您编写的其他代码。为什么您希望同一条记录会有所不同?请求应该足够短,以至于这不是一个期望,更像是一个例外。你是在读它,更改它,然后在同一个请求中再次尝试阅读它吗?不管您提到的问题是什么,这听起来像是代码中可能存在的逻辑缺陷`就像我说的,缓存的唯一方法是.Find。默认情况下,每次调用数据库时,FirstOrDefault都会命中它。
Context.Set<Product>().AsNoTracking().Where(x => x.whatever).ToList();