C# 强制实体框架查询数据库
我有一个使用相同数据库的服务和一个Web应用程序,以及数据库上下文的公共库。我正在处理我的数据库上下文,但是当我在数据库中手动插入一行时,它不会显示在webapp中,而是在服务中工作 通过记录实体框架,我注意到以下区别:C# 强制实体框架查询数据库,c#,database,entity-framework,C#,Database,Entity Framework,我有一个使用相同数据库的服务和一个Web应用程序,以及数据库上下文的公共库。我正在处理我的数据库上下文,但是当我在数据库中手动插入一行时,它不会显示在webapp中,而是在服务中工作 通过记录实体框架,我注意到以下区别: SERVICE - Completed in 8 ms with result: EFMySqlDataReader WEBAPP - Completed in 16 ms with result: CachingReader 所以我怀疑这与webapp使用缓存结果而不是查
SERVICE - Completed in 8 ms with result: EFMySqlDataReader
WEBAPP - Completed in 16 ms with result: CachingReader
所以我怀疑这与webapp使用缓存结果而不是查询数据库有关。有没有办法强制查询数据库
-
为了完整性,它会生成两个相同的查询:
public static async Task<int> CountMailsInQueueAsync()
{
using (var ctx = new GdprContext())
{
ctx.Database.Log = s => Log.Debug(s);
// SELECT `GroupBy1`.`A1` AS `C1`
// FROM
// (SELECT COUNT(1) AS `A1`
// FROM `tbl_email` AS `Extent1`
// WHERE (0 = (`Extent1`.`MailStatus`))
// OR (1 = (`Extent1`.`MailStatus`))) AS `GroupBy1`;
return await ctx.Emails
.Where(e => e.MailStatus == InfMailStatus.Ready || e.MailStatus == InfMailStatus.Processing)
.CountAsync();
}
}
// same connection string:
// "server=localhost;user=dev;database=dev;port=3306;password=none;charset=utf8;Allow User Variables=True;Convert Zero Datetime=True;Allow Zero Datetime=True"
//
// using MySql.Data.Entity v6.9.9
EF不缓存查询结果,即所谓的二级缓存
名称CachingReader表示WEBAPP项目正在使用包。查找它在该项目中是如何设置的,并阅读软件包文档如何忽略/强制缓存重建必须存在一个或类似的问题。您是否尝试在一行中多次查询同一个提供程序的10倍,并查看CachingReader是否真的比DB慢?EF不会缓存查询结果。看起来您正在使用包。@IvanStoev,我认为使用代理和跟踪,EF至少跟踪6个实体。也就是说,如果使用相同的上下文实例加载两次相同的实体,则第二次加载的结果将不会用于更新第一次加载的结果。当然,此行为不应影响计数结果。@tschmit007跟踪与二级缓存无关。另外,EF6没有CachingReader类,而链接中的第三方包有。@IvanStoev啊,我明白了,你是对的。我不知道这个项目中有这个包。如果你加上它作为答案,我可以把它标记为正确。