Postman发送POST请求时EF Core一对多模型出现JSON对象循环错误如何解决
问题结论
这个错误不是请求语法问题,属于后端服务侧的序列化配置以及实体模型设计导致的循环引用问题。
错误原因
你的两个实体采用了双向导航关联:
Server类通过UpdateList属性关联多个Update实例Update类又通过Server导航属性反向关联所属的Server实例
当系统序列化包含关联数据的实体时,会进入「序列化Server→序列化关联的Update→序列化Update的Server属性→序列化这个Server关联的Update……」的无限循环,最终触发JSON序列化的深度限制报错。
解决方案
你可以选择以下任意一种方案修复:
方案1(最推荐):增加DTO层隔离
不要直接将数据库实体类作为接口的入参/出参模型,单独定义专门用于接口交互的DTO类,去掉不必要的反向导航属性:
示例的CreateServerDto和CreateUpdateDto定义:
public class CreateUpdateDto { public string updateId { get; set; } public string updateTitle { get; set; } public string updateDescription { get; set; } } public class CreateServerDto { public string ComputerName { get; set; } public string Type { get; set; } public string Estado { get; set; } public string Phase { get; set; } public List<CreateUpdateDto> UpdateList { get; set; } }
接口层用DTO接收参数,再映射为数据库实体进行数据库操作,从根源避免循环引用问题,同时也能避免暴露数据库字段的敏感信息。
方案2:修改JSON序列化配置
如果不想调整实体和新增DTO,可以在.NET的服务注册阶段配置System.Text.Json的序列化规则,忽略循环引用:
.NET 6+的Program.cs中添加如下配置:
builder.Services.AddControllers() .AddJsonOptions(options => { // 忽略循环引用的属性 options.JsonSerializerOptions.ReferenceHandler = System.Text.Json.Serialization.ReferenceHandler.IgnoreCycles; });
注意:如果使用
ReferenceHandler.Preserve会在序列化结果中新增$id、$ref类的标记字段,需要前端配合适配,更推荐用IgnoreCycles直接忽略循环的关联属性。
方案3:给反向导航属性加序列化忽略标记
直接在Update实体的反向导航属性上添加[JsonIgnore]特性,让序列化时跳过该属性:
using System.Text.Json.Serialization; public class Update { // 其余属性保持不变 [JsonIgnore] public virtual Server Server { get; set; } }
补充说明
你当前Postman请求的小驼峰参数命名和实体的大驼峰属性命名不匹配的问题,属于.NET默认支持的大小写不敏感匹配范围,不会导致本次报错,不需要调整。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

