ef core值转换器是处理枚举存字符串、对象存json的默认推荐路径;内置enumtostringconverter可直接使用,json字段应优先用hascolumntype("json")而非hasconversion手动序列化。

EF Core 值转换器不是“可选技巧”,而是处理枚举存字符串、对象存 JSON 的**默认推荐路径**——只要你不打算手动在每个 SaveChanges 前序列化、每次读取后反序列化。
枚举转字符串:用 ConvertUsing 配合内置转换器最稳
数据库里存 0/1 查起来费劲,改存 "Default"/"NotDefault" 更直观。EF Core 提供了开箱即用的 ValueConverter<tenum string></tenum>,不用自己写解析逻辑。
- 必须显式指定枚举底层类型(比如
int),否则 EF 可能推断为byte导致映射失败 -
ConvertUsing比HasConversion更清晰,明确表达“我只关心转换行为”,不混入序列化选项 - 若枚举有
[Description]或自定义属性,需自行实现转换器,不能依赖内置版本
modelBuilder.Entity<addressbook>()
.Property(e => e.IsDefault)
.HasConversion(new EnumToStringConverter<addressdefaultstatus>());</addressdefaultstatus></addressbook>
JSON 字段:优先用 HasColumnType("json") 而非字符串转换
把 Dictionary<string object></string> 或 List<string></string> 存成 JSON 字符串?别再用 HasConversion 手动调 JsonSerializer.Serialize —— 这会让字段失去数据库原生 JSON 函数能力(如 SQL Server 的 JSON_VALUE、PostgreSQL 的 ->>)。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- SQL Server 用
.HasColumnType("json"),PostgreSQL 用.HasColumnType("jsonb"),MySQL 8+ 用.HasColumnType("json") - EF Core 5+ 会自动绑定
System.Text.Json,无需额外配置序列化选项,除非你真需要PropertyNameCaseInsensitive = true - 如果字段是
string类型但内容是 JSON,EF 不会识别为 JSON 列,查询时无法用EF.Functions.JsonContains等函数
modelBuilder.Entity<user>()
.Property(u => u.Profile)
.HasColumnType("jsonb"); // PostgreSQL</user>
HasConversion 适合什么场景?只在数据库不支持 JSON 类型时才用
当你的数据库是 SQL Server 2014 或更老版本、或用 SQLite(无 JSON 扩展)、或字段类型被锁定为 nvarchar(max) 时,HasConversion 才是合理选择。
- 务必检查
null:传入null时,JsonSerializer.Serialize返回"null"字符串,而你可能期望空字符串或NULL数据库值 - 避免在转换器里做耗时操作(如加密/解密),它会在每次读写时执行,且无法异步
- 不要在转换器中引用
IConfiguration或服务容器,它不是 DI 生命周期的一部分
modelBuilder.Entity<product>()
.Property(p => p.Details)
.HasConversion(
v => JsonSerializer.Serialize(v, (JsonSerializerOptions)null),
v => string.IsNullOrEmpty(v) ? null : JsonSerializer.Deserialize<productdetails>(v, (JsonSerializerOptions)null));</productdetails></product>
容易被忽略的 null 处理和迁移问题
值转换器不会自动修改已有数据库列类型。如果你已上线系统,新增 JSON 列或改枚举存储方式,必须手工处理迁移:
- 旧数据迁移脚本要同步更新:比如把整数枚举批量转成字符串,不能只靠 EF 运行
Update-Database - 使用
HasConversion后,EF 认为该列仍是原始类型(如string),但实际存的是 JSON 文本——这意味着你无法在 LINQ 查询中直接访问 JSON 内部字段,只能查整个字符串 - PostgreSQL 的
jsonb列默认不索引内部路径,要用CREATE INDEX ... USING GIN (profile jsonb_path_ops)才能高效查profile->>'hobby'










