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

如何在EF Code-First迁移中为字段转jsonb添加USING子句?

解决EF Core Code-First迁移中text转jsonb的类型转换错误

因为你的Message字段存在无效JSON内容,PostgreSQL无法自动完成text到jsonb的类型转换,必须通过USING子句指定转换逻辑来处理无效数据。EF Core自动生成的AlterColumn不支持直接添加USING,需要手动修改迁移文件,具体操作如下:

  1. 删除自动生成的AlterColumn代码,改用Sql方法执行原生PostgreSQL语句:
// 替换原有的AlterColumn代码
migrationBuilder.Sql(@"
ALTER TABLE ""database"".""ScheduledEvent"" 
ALTER COLUMN ""Message"" TYPE jsonb 
USING CASE 
    -- 判断转换后的JSON是否有效,有效则保留转换结果
    WHEN jsonb_typeof(""Message""::jsonb) IS NOT NULL THEN ""Message""::jsonb 
    -- 无效JSON替换为空对象(适配你的nullable: false配置)
    ELSE '{}'::jsonb 
END;
");
  1. 根据实际需求调整转换逻辑:
    • 如果允许Message字段为null,可把ELSE后的'{}'::jsonb改成NULL
    • 若想保留无效JSON的原内容,可转成包含原文本的JSON对象:
      ELSE '{"invalid_content": "' || replace("Message", '''', '''''') || '"}'::jsonb
      

注意事项

  • 执行迁移前务必备份数据,避免转换逻辑失误导致数据丢失
  • 这种方式需要手动修改迁移文件,EF Core的Code-First模型配置无法自动生成带USING子句的迁移代码,后续若再涉及类似类型转换,仍需手动调整

内容的提问来源于stack exchange,提问作者A. Hasemeyer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:35:20