You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 10:54:52