使用DI注入MyDbContext的两种实现差异及报错原因咨询
报错原因分析:DbContextOptions泛型参数不匹配
你第二种实现的报错核心原因是构造函数中依赖的DbContextOptions<DbContext>类型与DI容器中注册的类型不匹配。
当使用AddDbContext<MyDbContext>(...)注册上下文时,EF Core会自动在DI容器中注册DbContextOptions<MyDbContext>类型,而非DbContextOptions<DbContext>。但你的MyDbContext构造函数声明依赖的是DbContextOptions<DbContext>,DI容器找不到该类型的服务实例,因此抛出无法解析的错误。
修复方法
将MyDbContext的构造函数修改为依赖DbContextOptions<MyDbContext>:
public MyDbContext(DbContextOptions<MyDbContext> options) : base(options) { }
如果需要构造函数更通用(比如用于继承场景),也可以使用非泛型的DbContextOptions:
public MyDbContext(DbContextOptions options) : base(options) { }
补充说明
第一种实现能正常运行,是因为你通过工厂方法手动创建MyDbContext实例,直接传入连接字符串,没有依赖EF Core的DbContextOptions注册逻辑,因此不会出现类型不匹配的问题。
内容的提问来源于stack exchange,提问作者Quito
相关产品推荐
相关产品推荐

