EF Core Compiled Model缓存是否会在长时间无请求时过期失效?
EF Core 模型编译缓存的空闲场景有效性说明
首先明确核心结论:EF Core 默认的编译模型缓存不会因为无请求空闲时间(哪怕是20分钟)主动失效。
- EF Core 编译完成的模型是存储在应用进程的静态内存区域的,缓存生命周期和整个应用进程绑定,和
DbContext实例的销毁、是否有查询请求的空闲时长没有关系,只要进程正常运行,缓存就会一直存在。 - 如果确实出现了间隔20分钟后首次查询仍然触发模型编译的高开销,本质原因一定不是EF Core模型缓存自身过期,大概率是以下场景导致:
- 应用的托管服务配置了空闲超时回收规则:比如IIS默认应用池的空闲超时时间就是20分钟,长时间无请求会直接销毁整个应用进程,后续新请求进来需要重新启动进程,自然要重新编译模型
- 代码实现中自定义了
IModelCacheKeyFactory,错误生成了不一致的缓存Key,导致每次初始化DbContext都触发重新编译 - 构造
DbContext配置时显式调用了UseModel()传入动态生成的模型,跳过了EF Core默认的缓存逻辑
优化方案
- 优先检查托管服务的空闲回收配置:如果是IIS托管,可以调大应用池的空闲超时时间,或者开启「始终运行」「预加载」的常驻配置,避免进程被意外回收
- 如果使用EF Core 6及以上版本,可以启用预编译模型功能,在项目发布阶段就完成模型编译并打包到程序集,彻底消除进程启动后的首次模型编译开销
- 排查自定义的模型相关配置,确认没有错误绕过默认缓存逻辑的代码
内容的提问来源于stack exchange,提问作者Salman A Mughal
相关产品推荐
相关产品推荐

