.NET Core下用C#和EF Core将嵌套JSON存入SQL Server
解决方案
方案1:使用EF Core的Owned Entity(推荐,适合值对象场景)
你的Usage是无独立业务标识的嵌套对象,属于主实体的一部分,适合用EF Core的Owned Entity特性映射,无需额外分表,字段直接存入主表:
- 修改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; } }
- 对应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单独存为一张表,需建立主外键关联:
- 修改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; } }
- 对应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 );
- 显式配置关系(可选,增强可读性):
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
相关产品推荐
相关产品推荐

