EF Core为字符串属性自动添加多余默认值问题排查
.NET Core 6 + Pomelo MySQL:字段默认值自动设为双引号的问题分析与解决
可能原因
- 迁移脚本错误:生成的迁移代码中误将
OperationCode的默认值定义为",导致MySQL执行后设置单个双引号作为默认值。 - Pomelo Provider的隐性处理:当非空字符串属性未显式配置默认值时,Pomelo的MySQL Provider可能触发了不符合预期的默认值生成逻辑,而其他表因迁移历史或配置细节差异未出现该问题。
- 模型配置的隐性差异:即便你认为代码逻辑一致,该字段可能曾有过修改,迁移脚本残留了错误配置;或者其他表的字段在初始化时的迁移逻辑存在细节差别。
解决方案
1. 修正迁移脚本
找到对应XXX表的迁移文件,检查Up()方法里的字段定义:
migrationBuilder.AlterColumn<string>( name: "OperationCode", table: "XXX", type: "varchar(250)", nullable: false, defaultValue: "\"", // 此处为问题根源 oldClrType: typeof(string), oldType: "varchar(250)");
删除defaultValue: "\""这一行,或者设置为你需要的默认值(比如空字符串""),然后重新执行dotnet ef database update。
2. 显式配置无默认值
在DbContext的实体配置中,明确指定字段不需要默认值,覆盖Provider的自动行为:
entity.Property(e => e.OperationCode) .HasColumnType("varchar(250)") .HasColumnName("operation_code") .HasDefaultValue(null); // 显式声明无默认值
注意:非空字符串字段如果没有默认值,插入数据时必须显式赋值,否则MySQL会报错。如果需要允许空值,要把模型属性改为
public string? OperationCode { get; set; },同时配置中移除nullable: false。
3. 重建干净的迁移
如果旧迁移有残留问题,可删除对应迁移文件和__EFMigrationsHistory表中的相关记录,重新生成迁移:
# 删除项目Migrations文件夹下的目标迁移文件 dotnet ef migrations add RebuildXXXTable dotnet ef database update
4. 检查版本兼容性
确保Pomelo.EntityFrameworkCore.MySql版本与.NET Core 6匹配,推荐使用6.x系列的稳定版本(如6.0.3),版本不兼容可能引发异常的生成逻辑。
内容的提问来源于stack exchange,提问作者ZihamZuhair
相关产品推荐
相关产品推荐

