部署MVC站点切换数据库时出现Code First与EDMX模式冲突错误的原因排查
哈哈,这个错误我太熟了!之前帮团队排查过好几次,核心就是EF的模式识别逻辑搞混了,给你梳理几个最可能的原因:
代码生成模式与运行模式不匹配
你用EDMX(Database First/Model First)生成的上下文类,本身绑定了数据库优先的元数据逻辑——比如自动生成的代码里可能会在OnModelCreating方法里做特殊处理,甚至依赖数据库里的EdmMetadata表。当你切换到测试数据库时,EF发现测试库没有Code First必备的__MigrationHistory表,同时又找不到EDMX模式对应的元数据,就会误以为你在用Code First模式跑Database First生成的代码,直接抛出冲突错误。测试库缺失EF元数据
你说两台库表结构一致,但大概率忽略了EF的元数据存储:开发库可能是你用EDMX同步生成的,自带了EdmMetadata这类EF需要的元数据表;但测试库可能是通过SQL脚本直接建的表,没同步这部分元数据。EF检测到这种差异,就会触发模式误判。连接字符串配置有遗漏
仔细检查下测试环境的连接字符串,是不是没同步EDMX相关的配置?比如开发库的连接字符串里可能带了Metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl这类指定EDMX元数据的参数,切换到测试库时如果没保留这部分,EF就会找不到元数据,进而报错。服务器依赖或版本差异
两台服务器上的Entity Framework版本是不是不一样?比如开发服务器用的是EF6.2,测试服务器是EF6.0,不同版本对模式检测的逻辑有细微差别。另外,测试服务器的应用程序池权限如果不够,导致EF无法读取项目里的EDMX文件,也会触发这个错误。
内容的提问来源于stack exchange,提问作者Mr.B

