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

EF Core一对多关系查询返回JSON不完整问题求助

解决JSON返回不完整的问题

你遇到的是循环引用导致JSON序列化中断的问题——你的User和Phone实体互相持有对方的导航引用,当JSON序列化器尝试序列化这些对象时,会陷入User→Phone→User→Phone...的无限循环,最终只能返回被截断的不完整结果。下面是几种可行的解决办法:

方法1:使用DTO(推荐方案)

最规范的做法是定义专门的数据传输对象(DTO),只暴露前端需要的字段,从根源上避免实体类的循环引用问题。

定义DTO类

public class UserDto
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime? DateOfBirth { get; set; }
    public List<PhoneDto> Phones { get; set; } = new List<PhoneDto>();
}

public class PhoneDto
{
    public int Id { get; set; }
    public string Number { get; set; }
}

修改控制器查询逻辑

[HttpGet]
public IEnumerable<UserDto> Get()
{
    var users = _db.Users.Include(p => p.Phone).ToArray();
    // 将实体映射为DTO返回
    return users.Select(u => new UserDto
    {
        Id = u.Id,
        FirstName = u.FirstName,
        LastName = u.LastName,
        DateOfBirth = u.DateOfBirth,
        Phones = u.Phone.Select(p => new PhoneDto
        {
            Id = p.Id,
            Number = p.Number
        }).ToList()
    });
}

方法2:配置System.Text.Json忽略循环引用

如果不想额外定义DTO,可以直接修改默认JSON序列化器的配置,让它自动忽略循环引用关系。

在Program.cs(.NET 6+)中配置服务

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
    });

方法3:改用Newtonsoft.Json并配置忽略循环

如果你的项目更习惯使用Newtonsoft.Json(Json.NET),可以替换默认序列化器并配置循环引用处理:

先安装NuGet包

Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson

配置服务

builder.Services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
    });

另外提个小建议:你的User类里的集合属性Phone建议改成Phones(复数形式),这样代码语义更清晰,也符合C#的命名规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:28:46