.NET 5 Code First添加第二个DbContext执行EF迁移时IMigrator解析异常
EF Core InMemory 上下文迁移报错排查方案
报错核心原因
执行迁移时抛出IMigrator服务解析失败,本质原因是EF Core 的 InMemory 数据库提供程序从设计层面就不支持 Migrations 迁移功能。
InMemory 提供程序的定位是轻量临时运行时存储,多用于单元测试、临时内存缓存场景,没有实现迁移功能依赖的IMigrator等服务接口,无论怎么调整配置,都无法为使用InMemory提供程序的DbContext创建、执行迁移。
现有配置校验
你贴出的代码和执行的命令本身没有语法或参数错误:
- 执行的命令
dotnet ef migrations add InMemoryMigrationContext --context CacheDbContext参数格式符合EF Core工具要求 CacheDbContext构造函数正确接收DbContextOptions<CacheDbContext>类型参数,并传递给DbContext基类构造函数- Startup中通过
AddDbContext<CacheDbContext>正确调用了UseInMemoryDatabase做配置
报错和上述写法无关,完全是InMemory提供程序的功能限制导致的。
解决方法
结合你使用InMemory作为缓存存储的场景,直接采用以下方案即可:
- 放弃为
CacheDbContext添加迁移的操作
InMemory数据库是程序运行时动态生成的临时存储,进程退出后数据和结构都会自动清空,不需要预先通过迁移创建表结构。只要你在CacheDbContext中正确定义了DbSet<CachedShortUrl>属性和对应的实体配置,程序运行时InMemory提供程序会自动根据实体模型生成对应存储结构,完全不影响正常使用。你之前为Postgres编写的ApplicationDbContext迁移可以正常执行,两个DbContext互相独立不会冲突。 - 如果你的缓存场景需要数据持久化
不要使用InMemory提供程序,替换为Sqlite、Postgres等支持迁移的数据库提供程序,单独配置缓存库的连接字符串后,再执行迁移命令即可。
注意:不要尝试通过重写OnConfiguring强行给InMemory场景加迁移逻辑,这是官方明确不支持的用法,强行实现也没有实际使用价值。
内容的提问来源于stack exchange,提问作者nim_10
相关产品推荐
相关产品推荐

