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

EF Core 7 JSON列配置:实现键值对Course存储与访问

EF Core 7 实现JSON列键值对存储的正确方案

核心方案:使用Dictionary<int, LearnerCustomDataCourseDto> + EF Core 7原生JSON列支持

EF Core 7原生支持将字典类型序列化为JSON键值对对象,无需复杂的Owned配置,以下是完整实现步骤:

1. 定义实体与DTO类

// 主实体
public class LearnerCustomData
{
    public int Id { get; set; }
    // 用字典存储键值对形式的课程数据
    public Dictionary<int, LearnerCustomDataCourseDto> Courses { get; set; } = new();
}

// 课程DTO(普通POCO类即可,无需额外标记)
public class LearnerCustomDataCourseDto
{
    public string CourseName { get; set; }
    public int CompletionProgress { get; set; }
    // 按需添加其他属性
}

2. DbContext配置

在OnModelCreating中,直接将Courses属性映射为JSON列:

public class AppDbContext : DbContext
{
    public DbSet<LearnerCustomData> LearnerCustomData { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        // 配置你的数据库连接字符串
        optionsBuilder.UseSqlServer("YourConnectionString");
        // 如果是PostgreSQL,替换为UseNpgsql
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<LearnerCustomData>()
            .Property(x => x.Courses)
            .ToJson(); // 关键:标记该属性存储为JSON列

        // 若需指定数据库特定JSON类型(如PostgreSQL的jsonb),可追加配置:
        // .HasColumnType("jsonb");
    }
}

3. 数据访问示例

直接通过字典键获取对应课程,和普通字典用法一致:

using var dbContext = new AppDbContext();

// 新增数据
var learner = new LearnerCustomData
{
    Courses = new Dictionary<int, LearnerCustomDataCourseDto>
    {
        { 123, new LearnerCustomDataCourseDto { CourseName = "EF Core入门", CompletionProgress = 80 } },
        { 456, new LearnerCustomDataCourseDto { CourseName = "ASP.NET Core进阶", CompletionProgress = 50 } }
    }
};
dbContext.LearnerCustomData.Add(learner);
dbContext.SaveChanges();

// 查询并通过键获取课程
var targetLearner = dbContext.LearnerCustomData.FirstOrDefault(l => l.Id == learner.Id);
if (targetLearner != null && targetLearner.Courses.ContainsKey(123))
{
    var course123 = targetLearner.Courses[123];
    // 处理课程数据
}

为什么KeyedCollection不可行?

KeyedCollection本质是集合类型,EF Core默认会将集合序列化为JSON数组(而非键值对对象),因此会触发InvalidOperationException(期望数组但实际是对象)。如果需要键值对存储,字典是最直接的选择。

内容的提问来源于stack exchange,提问作者Chris Rockwell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:43:29