如何在EF Code-First迁移中为字段转jsonb添加USING子句?
解决EF Core Code-First迁移中text转jsonb的类型转换错误
因为你的Message字段存在无效JSON内容,PostgreSQL无法自动完成text到jsonb的类型转换,必须通过USING子句指定转换逻辑来处理无效数据。EF Core自动生成的AlterColumn不支持直接添加USING,需要手动修改迁移文件,具体操作如下:
- 删除自动生成的
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; ");
- 根据实际需求调整转换逻辑:
- 如果允许
Message字段为null,可把ELSE后的'{}'::jsonb改成NULL - 若想保留无效JSON的原内容,可转成包含原文本的JSON对象:
ELSE '{"invalid_content": "' || replace("Message", '''', '''''') || '"}'::jsonb
- 如果允许
注意事项
- 执行迁移前务必备份数据,避免转换逻辑失误导致数据丢失
- 这种方式需要手动修改迁移文件,EF Core的Code-First模型配置无法自动生成带USING子句的迁移代码,后续若再涉及类似类型转换,仍需手动调整
内容的提问来源于stack exchange,提问作者A. Hasemeyer
相关产品推荐
相关产品推荐

