DEBUG.WIKI
搬瓦工;先看线路,再选 VPS;CN2 GIA · 对应线路套餐;查看线路 →
野草云;香港 200Mbps 峰值;不限月流量 · BGP VPS;查看套餐 →
RackNerd;$21.99/年 · 1GB KVM

EF Core 添加迁移报 ArgumentIsEmpty 找不到,检查启动项目的 Design 包

EF Tools 10.0.6—10.0.8 可能解析到旧 Design,导致迁移缺方法或 CSharpHelper 加载失败;显式引用启动项目所需版本,10.0.9 已调整依赖。

执行 Add-Migration 或 dotnet ef migrations add 时,异常还没进入模型比较,就报:

MissingMethodException:
Method not found: AbstractionsStrings.ArgumentIsEmpty(System.Object)

另一种表现是 CSharpHelper.Identifier 没有实现,加载的 Microsoft.EntityFrameworkCore.Design 却显示为 8.0.0.0。项目明明使用 EF Core 10,这时先检查工具实际加载的 Design 包,而不是反复改实体或删除迁移。

EF Core Tools 10.0.6 至 10.0.8 降低了传递依赖的 Design 最低版本,可能让 NuGet 解析到旧包。10.0.9 的正式包已经按目标框架区分依赖,net10.0 对应 Design 10.0.9。这不是所有后续 10.0.x 都存在的固定回归。

引用要落在真正的启动项目中

若应用仍在受影响组合,或依赖图显示 Design 不匹配,在实际启动项目中显式引用与其他 EF 包一致的版本。下面仅示意已经统一到 10.0.9 的工程:

<PackageReference Include="Microsoft.EntityFrameworkCore.Design"
                  Version="10.0.9">
  <PrivateAssets>all</PrivateAssets>
  <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>

项目使用更新的合适维护版本时,同步替换示例版本;不能为了照抄片段,把其他 EF 包仍在更高版本的应用单独降回 10.0.9。数据库提供程序也要符合对应 EF 版本的兼容要求。

DbContext、迁移和启动代码不在同一个项目时,--project 指向目标项目,--startup-project 决定工具构建和运行哪个启动应用。只在存放 DbContext 的类库里补引用,未必能改变启动项目加载的 Design。

Central Package Management 工程应在 Directory.Packages.props 声明 PackageVersion,启动项目仍要有不带版本号的 PackageReference。集中声明版本不等于项目已经引用了它。

对照解析结果与工具入口

先记录两个项目的包,再核对实际命令使用的工具:

dotnet list path/to/Api.csproj package --include-transitive
dotnet list path/to/Data.csproj package --include-transitive
dotnet ef --version

路径替换为实际启动项目和迁移项目。.NET SDK 的版本不是 dotnet-ef 的版本,Visual Studio Package Manager Console 的 Tools 包也不是 CLI 工具本身。若仓库有本地 tool manifest,命令可能优先使用它,不能只更新全局工具就算完成。

修改引用后重新 restore,必要时重启仍加载旧程序集的 IDE 会话,再检查解析结果。应看到启动路径中的 EF runtime、Design 和所用工具版本符合项目要求;若仍指向 8.0.0,继续查直接依赖、锁文件和真实启动项目,不要用手工复制 DLL 的办法盖住它。

先生成并审查迁移,不直接改数据库

恢复后在隔离分支重新生成原先失败的迁移,审查生成的操作和模型快照。这里解决的是设计时程序集不匹配;如果之后又出现判别器类型的重复迁移,应按模型差异另行处理。

不需要为这条缺方法错误删除历史迁移、清空数据库,或立即执行 database update。成功标准是设计时工具正确加载并完成预期任务,生成内容也符合真实模型;数据库应用仍走原来的审查与发布流程。