EF6.exe在不同环境执行时抛出System.TypeLoadException问题求助
问题根源
报错Could not load type 'System.Data.Entity.Infrastructure.Design.Executor+Update'本质是EF6程序集版本不匹配或部署环境中存在程序集冲突/缓存,尽管测试环境正常,但预发布环境的部署流程或服务器状态可能存在差异。
具体修复步骤
1. 核对预发布服务器的EF6程序集版本
登录预发布服务器,检查部署目录下EntityFramework.dll的版本,必须和测试环境完全一致(包括主版本、次版本及公钥令牌)。用PowerShell验证:
(Get-Item .\EntityFramework.dll).VersionInfo | Select-Object ProductVersion, FileVersion
如果版本不符,彻底清理预发布部署目录,重新部署完整的应用包。
2. 确保ef6.exe与EF6程序集版本严格对应
部署脚本中使用的ef6.exe必须和项目引用的EF6版本完全匹配,不能混用不同版本的工具。直接使用项目NuGet包目录中的ef6.exe(路径示例:packages\EntityFramework.6.4.4\tools\ef6.exe)替换脚本中的工具路径。
3. 验证配置转换后的EF配置完整性
对比测试与预发布环境的最终app.config,确保<entityFramework>配置节完全一致(仅数据库连接字符串不同)。配置转换可能意外修改了EF的程序集绑定或迁移配置节点,导致类型加载失败。可以手动复制测试环境的app.config,替换连接字符串后在预发布环境测试迁移。
4. 清理预发布服务器的程序集缓存
服务器可能残留旧版本EF程序集缓存,执行以下操作:
- 删除部署目录下的临时文件、
bin/obj文件夹(若存在) - 若服务器GAC中存在旧版本EF,执行清理(需管理员权限):
gacutil /u EntityFramework
5. 优化迁移脚本,显式指定关键参数
修改PowerShell脚本,调用ef6.exe时显式指定程序集、配置类等参数,避免自动加载错误的资源:
.\ef6.exe database update ` --assembly .\YourApplication.dll ` --configuration YourAppNamespace.Migrations.Configuration ` --connection-string "Data Source=PreReleaseDB;Initial Catalog=YourDB;Integrated Security=True" ` --connection-provider "System.Data.SqlClient"
6. 确认.NET Framework版本兼容性
确保预发布服务器安装的.NET Framework版本与测试环境一致,EF6最低要求.NET Framework 4.5,版本过低会导致类型加载异常。
内容的提问来源于stack exchange,提问作者Robert

