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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:08:17