在Package Manager Console外运行ef6.exe的程序集绑定重定向问题
问题描述
我有一个使用Entity Framework 6的C#/ASP.NET MVC项目。在Visual Studio的Package Manager Console中运行Update-Database -Verbose部署数据库迁移时一切正常。通过-Verbose参数看到实际执行的ef6.exe命令,将其复制到PowerShell控制台运行时,出现程序集绑定重定向错误:
info: System.IO.FileLoadException: Could not load file or assembly 'System.ComponentModel.Annotations, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
我的配置文件中已配置如下程序集绑定重定向:
<dependentAssembly> <assemblyIdentity name="System.ComponentModel.Annotations" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.2.1.0" newVersion="4.2.1.0" /> </dependentAssembly>
似乎ef6.exe在Package Manager Console外运行时不遵循绑定重定向。请问为何同一条命令在两种环境下表现不同?Package Manager Console存在哪些PowerShell没有的上下文?
问题原因与解决方案
核心差异:执行上下文与配置加载逻辑
Package Manager Console(PMC)和普通PowerShell的核心区别在于运行环境的配置继承与程序集加载上下文:
- PMC的上下文注入:PMC是Visual Studio的内置控制台,会自动加载当前项目的配置文件(如
web.config/app.config),同时将项目的输出目录添加到程序集搜索路径。执行Update-Database时,PMC会把项目的配置信息(包括绑定重定向规则)传递给ef6.exe,确保程序集加载符合预期。 - 普通PowerShell的独立运行:直接运行ef6.exe时,它默认只会读取自身所在目录下的
ef6.exe.config,不会自动加载你的项目配置。因此你在项目配置中设置的绑定重定向不会生效,导致出现版本不匹配的加载错误。
可行解决办法
方法1:复制项目配置到ef6.exe目录
找到ef6.exe的安装路径(通常位于项目的packages\EntityFramework.6.x.x\tools目录下),将项目web.config或app.config中的<runtime>节点(包含绑定重定向规则)复制到ef6.exe.config中,覆盖或补充原有配置。
方法2:命令行指定项目配置文件
在PowerShell中运行ef6.exe时,通过-config参数明确指定项目配置文件的路径,示例命令:
& .\ef6.exe update-database -verbose -project "YourProjectName" -config "C:\YourProjectPath\Web.config"
方法3:手动注入项目上下文环境变量
在外部PowerShell中手动设置项目相关的环境变量,模拟PMC的上下文,示例:
# 添加项目输出目录到程序集搜索路径 $env:PATH += ";C:\YourProjectPath\Bin\Debug" # 指定使用项目的配置文件 $env:APP_CONFIG_FILE = "C:\YourProjectPath\Web.config" # 执行迁移命令 & .\ef6.exe update-database -verbose -project "YourProjectName"
内容的提问来源于stack exchange,提问作者Cooper
相关产品推荐
相关产品推荐

