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 检查剩余差异;命令仍有输出时,应逐项核对,而不是继续忽略模型变化警告。


