EF Core 7将object存入JSON列时仅生成空JSON的问题求助
解决EF Core 7存储动态JSON到SQL列的问题
问题出在你用OwnsOne配置object类型的Data属性。OwnsOne是EF Core用来映射**拥有实体(Owned Entity)**的API,它需要明确的实体类型识别属性,但object无固定结构,匿名类型的属性无法被EF Core追踪序列化,最终生成空JSON。
正确做法是直接将Data属性配置为JSON列,无需使用OwnsOne,步骤如下:
1. 修改实体配置
在OnModelCreating中,直接对Data属性配置JSON序列化:
modelBuilder.Entity<TaskActivity>() .Property(x => x.Data) .ToJson();
EF Core 7+支持这种简洁写法,会自动将属性映射为SQL的JSON列,并处理动态对象的序列化/反序列化。
如果需要自定义序列化规则,也可以手动配置转换逻辑:
modelBuilder.Entity<TaskActivity>() .Property(x => x.Data) .HasColumnType("nvarchar(max)") .HasConversion( v => JsonSerializer.Serialize(v, new JsonSerializerOptions { WriteIndented = false }), v => JsonSerializer.Deserialize<object>(v, new JsonSerializerOptions()) );
2. 重新生成迁移并更新数据库
删除之前生成的迁移文件,重新执行迁移命令:
Add-Migration ResetDataJsonColumn Update-Database
3. 测试数据插入
现在赋值匿名类型或其他动态对象,EF Core会正确序列化到JSON列:
var record = new TaskActivity { DateUtc = DateTime.UtcNow, Type = 1, Data = new { A = 2, B = 4 } }; context.TaskActivities.Add(record); await context.SaveChangesAsync();
原方式失效的原因
OwnsOne<T>要求T是具体类,EF Core会解析该类的属性生成JSON结构,但object没有可识别的属性,所以序列化后得到空的{}。直接对object属性使用ToJson,EF Core会用全局JSON序列化规则处理动态对象,完整保留所有属性。
内容的提问来源于stack exchange,提问作者kokokok
相关产品推荐
相关产品推荐

