DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

EF Core 10 反复生成判别器类型迁移,检查模型快照

EF Core 10 的非字符串判别器可能因快照遗漏类型而反复产生假迁移,更新含10.0.2修补的工具链后仍需核对旧快照。

模型和数据库中的 Discriminator 已经是整数或枚举,升级 EF Core 10 后,每次生成迁移却仍然出现从字符串改成整数的 AlterColumn。有的应用还会提示判别器值无法赋给 string。这时先检查模型快照,不要顺着新迁移去改数据库列。

受影响的快照可能同时包含这两句:

b.Property<int>("Discriminator").HasColumnType("int");
b.HasDiscriminator();

第一句声明了整数属性,第二句却没有保留判别器的类型和名称。重新读取快照时,无参数的配置可能重新建立默认字符串判别器。迁移比较看到的旧模型已经偏离真实列类型,于是不断生成同一组假差异。这个问题见于 EF Core 10 RC2 及 10.0.0 的非字符串判别器,既有 PostgreSQL 提供程序案例,也有 SQL Server 案例。

更新运行库,也更新生成快照的工具

EF Core 10.0.2 包含修补,快照生成器会保留类型参数和属性名称。更新时应让 EF Core 运行库、Microsoft.EntityFrameworkCore.Design 和 dotnet-ef 使用一致且包含修补的 10.0 版本,并核对数据库提供程序声明的兼容范围。

dotnet ef --version
dotnet list path/to/App.csproj package

.NET SDK 的版本号不能代替 dotnet-ef 或项目包版本。只更新项目引用而继续用旧工具生成迁移,或者只更新工具而遗漏 Design 包,都不足以确认修补已经作用于生成路径。

生成后的快照应明确表达原有类型,例如:

b.Property<int>("Discriminator").HasColumnType("int");
b.HasDiscriminator<int>("Discriminator");

实际使用枚举、转换器或自定义属性名时,保留相应配置,不能把所有判别器统一改成整数。

旧错误快照不会自动消失

更新工具后,已有快照中的错误配置仍可能存在。先在临时分支核对模型配置、最后已应用的迁移以及数据库实际列定义,再生成新的诊断迁移。确认只有这项误判、数据库本来就符合目标模型时,可以让新迁移修正快照,并移除经核查属于假差异的操作;真实的其他模型变化仍须保留。

不要批量清空所有 Up()、Down(),也不要重写已经应用的迁移历史。为绕过报错而重命名判别器,可能生成 DropColumn、AddColumn,反而把一个快照问题变成真实数据变更。

修正后的验收是再次生成比较结果,不再出现同一项类型转换,且各派生类型的判别器值与现有记录相符。可以再执行 dotnet ef migrations has-pending-model-changes 检查剩余差异;命令仍有输出时,应逐项核对,而不是继续忽略模型变化警告。