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
相关产品推荐
相关产品推荐

