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

.NET Core下用C#和EF Core将嵌套JSON存入SQL Server

解决方案

方案1:使用EF Core的Owned Entity(推荐,适合值对象场景)

你的Usage是无独立业务标识的嵌套对象,属于主实体的一部分,适合用EF Core的Owned Entity特性映射,无需额外分表,字段直接存入主表:

  1. 修改C# POCO类:
public class YourMainEntity
{
    public string Id { get; set; }

    // 给Usage添加[Owned]特性,标记为从属值对象
    [Owned]
    public Usage Usage { get; set; }
}

public class Usage
{
    public int Sent { get; set; }
    public int Recv { get; set; }
    public int Total { get; set; }
}
  1. 对应SQL Server主表结构(默认映射列名为Usage_Sent、Usage_Recv、Usage_Total,可自定义):
CREATE TABLE YourMainTable (
    Id VARCHAR(50) PRIMARY KEY,
    Usage_Sent INT NOT NULL,
    Usage_Recv INT NOT NULL,
    Usage_Total INT NOT NULL
);

若要自定义列名,用Fluent API配置:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<YourMainEntity>()
        .OwnsOne(e => e.Usage, u =>
        {
            u.Property(p => p.Sent).HasColumnName("Sent");
            u.Property(p => p.Recv).HasColumnName("Recv");
            u.Property(p => p.Total).HasColumnName("Total");
        });
}

配置完成后,调用db.SaveChanges()时,Usage的三个字段会自动存入主表对应列,无需添加[NotMapped],也不会触发对象关系错误。

方案2:拆分主从表(适合Usage需独立存储的场景)

若要将Usage单独存为一张表,需建立主外键关联:

  1. 修改POCO类,添加导航属性与外键:
public class YourMainEntity
{
    public string Id { get; set; }
    // 关联Usage表的导航属性
    public Usage Usage { get; set; }
}

public class Usage
{
    // 主键同时作为主表的外键
    public string Id { get; set; }
    public int Sent { get; set; }
    public int Recv { get; set; }
    public int Total { get; set; }

    // 关联主表的导航属性
    public YourMainEntity MainEntity { get; set; }
}
  1. 对应SQL Server表结构:
-- 主表
CREATE TABLE YourMainTable (
    Id VARCHAR(50) PRIMARY KEY
);

-- Usage表,Id关联主表主键
CREATE TABLE UsageTable (
    Id VARCHAR(50) PRIMARY KEY FOREIGN KEY REFERENCES YourMainTable(Id),
    Sent INT NOT NULL,
    Recv INT NOT NULL,
    Total INT NOT NULL
);
  1. 显式配置关系(可选,增强可读性):
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<YourMainEntity>()
        .HasOne(e => e.Usage)
        .WithOne(u => u.MainEntity)
        .HasForeignKey<Usage>(u => u.Id);
}

此方式下,保存主实体时EF Core会自动级联保存Usage数据,无需[NotMapped]。

关于[NotMapped]的问题

[NotMapped]的作用是告诉EF Core不映射该属性到数据库字段,所以添加后Usage的数据自然不会被保存。之前的对象关系错误,是因为EF Core默认将嵌套类视为独立实体,但你未配置它与主实体的关联关系导致的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 00:48:15