.NET6+EF新增迁移后单元测试突发OutOfMemoryException求助
解决方案
1. 切换测试运行器到64位模式
32位进程内存上限约2GB,380个EF迁移叠加3360个测试极易触发内存不足:
- Visual Studio:测试菜单 → 测试设置 → 默认处理器架构 → 选择X64
- 命令行运行
dotnet test时,添加--arch x64参数,或确保项目目标平台设为64位
2. 剥离测试环境的EF迁移依赖
单元测试无需加载全部历史迁移,优化DbContext配置:
- 测试项目中配置DbContext时,使用
UseInMemoryDatabase或UseSqlite直接初始化空白数据库,跳过AddMigrations调用 - 若必须应用迁移,仅加载核心初始化迁移,而非自动扫描全部380个迁移(通过
AddMigrations指定具体迁移类实现)
3. 规范DbContext的生命周期管理
- 每个测试结束后强制Dispose DbContext,避免内存泄漏;用xUnit
IClassFixture或NUnitSetUp/TearDown复用初始化逻辑,减少重复创建开销 - 替换InMemory数据库为SQLite内存库:InMemory不会自动清理,SQLite可通过关闭连接直接释放内存,降低内存堆积
4. 排查新增迁移的异常触发点
- 临时删除新增的空迁移,验证测试是否恢复正常,确认是否为该迁移的元数据处理导致内存溢出
- 清理项目bin/obj目录,重建解决方案,清除EF迁移缓存
5. 优化IDesignTimeDbContextFactory的环境适配
确保Factory仅在设计时生效,测试环境返回轻量化实例:
- 在Factory类中判断运行环境,仅在设计时(如执行
add-migration命令)加载完整迁移配置,测试环境返回不包含迁移依赖的DbContext
内容的提问来源于stack exchange,提问作者Chi
相关产品推荐
相关产品推荐

