ASP.NET MVC5/EF6添加迁移报找不到应用配置文件连接字符串错误
EF迁移时DbContext初始化报错根因
- 第一个「找不到指定名称连接字符串」报错的核心原因:EF迁移工具运行在设计时上下文,默认只会读取当前设置为启动项目的配置文件加载连接配置,不会主动读取DbContext所属项目的配置文件。你未将带拦截器的项目设为启动项时,工具读取的是另一个MVC项目的配置,哪怕你手动复制了连接字符串,只要配置的命名、加载路径和DbContext里写死的读取逻辑不匹配,就会触发该报错。
- 第二个设为启动项目后触发的报错,根源在
KFI_IPPContext.vb文件第17行的代码逻辑:这行代码一般是在DbContext构造函数中直接注册命令拦截器、或者硬编码执行依赖完整Web运行时的配置读取逻辑。迁移工具实例化DbContext时,不会启动完整的ASP.NET MVC请求管道、不会初始化IOC容器、也不会加载HttpContext等运行时对象,这行依赖运行时环境的代码执行时就会抛出空引用、加载失败类的异常。 - 你尝试的复制连接字符串到所有web.config、清理重建解决方案操作无效的原因:这些操作只解决了连接字符串读取的表层问题,没有解决「设计时上下文不支持DbContext初始化阶段嵌入的运行时依赖逻辑」的核心矛盾,只要第17行代码在DbContext实例化时自动执行,迁移工具运行时就会触发异常。
- 注释掉第17行就能正常执行迁移、且不影响应用正常运行的原因:注释后DbContext初始化时不会触发运行时依赖的逻辑,EF设计时工具可以用默认规则加载模型、生成迁移脚本;等你切回正常应用运行时,整个Web管道、依赖项都完整加载,取消注释后拦截器逻辑可以正常执行,不会出现运行时错误。
补充说明:如果不想每次迁移都手动注释代码,可以给DbContext加设计时工厂类,单独指定迁移时的DbContext初始化逻辑,和运行时逻辑隔离开,就不会出现这类冲突。
内容的提问来源于stack exchange,提问作者Mohammad Javahery
相关产品推荐
相关产品推荐

