Visual Studio 2022中EF6 Code First执行Add-Migration报错求助
问题场景
在Visual Studio 2022环境下使用Entity Framework 6(EF6)的Code First模式开发时,执行Add-Migration迁移命令失败,触发System.ArgumentNullException异常,提示参数type的值不能为null,异常堆栈显示错误出在EF迁移工具检测项目类型的逻辑环节。
执行的命令与完整错误信息如下:
PM> EntityFramework\Add-Migration -ConfigurationTypeName STS.Core.Migrations.Configuration "AddCheckChanges" System.ArgumentNullException: Value cannot be null. Parameter name: type at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes) at System.Activator.CreateInstance(Type type, Object[] args) at System.Data.Entity.Migrations.Extensions.ProjectExtensions.GetProjectTypes(Project project, Int32 shellVersion) at System.Data.Entity.Migrations.Extensions.ProjectExtensions.IsWebSiteProject(Project project) at System.Data.Entity.Migrations.Extensions.ProjectExtensions.GetTargetDir(Project project) at System.Data.Entity.Migrations.MigrationsDomainCommand.GetFacade(String configurationTypeName, Boolean useContextWorkingDirectory) at System.Data.Entity.Migrations.AddMigrationCommand.Execute(String name, Boolean force, Boolean ignoreChanges) at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command) Value cannot be null. Parameter name: type
问题根因
该异常是EF6的包管理器控制台迁移工具在适配VS2022时的典型兼容问题:旧版本EF6的工具逻辑通过反射获取Visual Studio的项目类型实例时,无法识别VS2022中部分新格式的项目(尤其是SDK风格的.NET Framework项目、未正确加载类型的网站项目),最终传入CreateInstance方法的type参数为null触发报错。
排查与解决方案
按优先级依次尝试以下操作:
- 修正包管理器控制台与启动项目配置
打开包管理器控制台,将顶部的「默认项目」选项切换为存放STS.Core.Migrations.Configuration迁移配置类和DbContext的EF核心项目;同时将解决方案的启动项目临时切换为该EF核心项目,避免工具去扫描不相关的启动项目类型。 - 升级EF6到兼容VS2022的版本
将所有引用EntityFramework的项目的NuGet包升级到6.4.4及以上的最新EF6正式版本,版本号低于6.4的EF6未做VS2022接口适配,是触发该错误的最常见诱因。升级完成后重启Visual Studio,重新生成解决方案再重试迁移命令。 - 调整迁移命令写法
去掉命令前的EntityFramework\前缀,直接执行以下命令:
执行前关闭所有打开的EF相关设计器窗口、项目属性页,避免EnvDTE接口被占用导致类型读取失败。Add-Migration -ConfigurationTypeName STS.Core.Migrations.Configuration "AddCheckChanges" - 给SDK风格项目添加EF识别标记
如果你的EF项目是SDK风格的.NET Framework类库,右键项目选择「编辑项目文件」,在首个<PropertyGroup>节点下添加以下配置:
保存后重载项目,重新生成解决方案再执行迁移。<ProjectTypeGuids>{E3E379DF-F4C6-4180-9B81-6769533ABE47};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> - 兜底修复操作
清理解决方案下所有项目的bin、obj文件夹,卸载项目后重新加载,关闭多项目启动配置切换为单项目启动,重新生成整个解决方案后再尝试执行迁移命令。
内容的提问来源于stack exchange,提问作者Tuan Le Anh
相关产品推荐
相关产品推荐

