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

EF Core 7.0中JSON列类型的实体配置方法咨询

EF Core 7.0 配置JSON列实现指定表结构

要实现你需要的表结构(Id(Guid)、Deleted(bool)、Data(json)),同时Data列包含所有实体属性的JSON数据,可以按照以下步骤配置:

1. 调整实体类结构

首先创建一个承载JSON数据的类,再修改原Entity类,保留Id和Deleted作为表的常规列,新增对应JSON结构的属性:

public class Entity
{
    public Guid Id { get; set; }
    public bool Deleted { get; set; }
    // 映射JSON列的属性
    public EntityData Data { get; set; } = new();
}

// 对应Data列的JSON结构
public class EntityData
{
    public Guid Id { get; set; }
    public bool Deleted { get; set; }
    public string Name { get; set; }
    public DateTime Date { get; set; }
}

2. 使用Fluent API配置实体映射

在DbContext的OnModelCreating方法中,利用EF Core 7.0的JSON映射特性完成配置:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Entity>(entity =>
    {
        // 配置Id为主键
        entity.HasKey(e => e.Id);

        // 配置Deleted为必填布尔列
        entity.Property(e => e.Deleted)
              .IsRequired();

        // 将EntityData配置为Owned Entity并映射到JSON列
        entity.OwnsOne(e => e.Data, dataBuilder =>
        {
            // 启用JSON映射(EF Core 7.0+核心特性)
            dataBuilder.ToJson();
            
            // 数据库适配配置:PostgreSQL用jsonb(支持索引),SQL Server用NVARCHAR(MAX)或JSON
            // dataBuilder.Property(x => x).HasColumnType("jsonb");
            // dataBuilder.Property(x => x).HasColumnType("NVARCHAR(MAX)");
        });

        // 指定JSON列的名称为Data
        entity.OwnsOne(e => e.Data).Property(x => x).HasColumnName("Data");
    });
}

3. 实体数据同步

由于表的Id、Deleted列与DataJSON中的对应字段需要保持一致,保存实体时需手动同步:

var newEntity = new Entity
{
    Id = Guid.NewGuid(),
    Deleted = false,
    Data = new EntityData
    {
        Name = "Example name",
        Date = DateTime.UtcNow
    }
};

// 同步主实体与Data中的Id、Deleted字段
newEntity.Data.Id = newEntity.Id;
newEntity.Data.Deleted = newEntity.Deleted;

// 保存到数据库
await dbContext.Entities.AddAsync(newEntity);
await dbContext.SaveChangesAsync();

补充说明

  • 这种Owned Entity + ToJson()的配置是EF Core 7.0官方推荐的JSON列映射方式,支持直接通过LINQ查询JSON内的属性(如dbContext.Entities.Where(e => e.Data.Name == "Test"))。
  • 不同数据库的JSON列类型需对应调整,PostgreSQL优先选jsonb,SQL Server可按需选择JSON或NVARCHAR(MAX)。

内容的提问来源于stack exchange,提问作者bartosz.grzeda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 19:30:56