Dea*_*eer 3 json postman entity-framework-core asp.net-core-webapi
我正在.NET Core中构建REST API服务器。我正在通过Postman软件测试我的代码。我的Include()方法有问题,使我可以附加导航属性数据。我试图在[HttpGet]操作中获取数据,并且返回的对象是错误的。
我的代码: 模型
会话模型
public class Session
{
[Key]
public int IDSession { get; set; }
[Required]
public DateTime LogInTime { get; set; }
public DateTime LogOutTime { get; set; }
[Required]
public int IDUser { get; set; }
public User User { get; set; }
[Required]
public int IDMachine { get; set; }
public Machine Machine { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
用户模型
public class User
{
[Key]
public int IDUser { get; set; }
[Required]
public string Forename { get; set; }
[Required]
public string Name { get; set; }
public string AvatarPath { get; set; }
public string Email { get; set; }
public string PhoneNumber { get; set; }
public string Password { get; set; }
public User CreatedBy { get; set; }
public DateTime CreatedAt { get; set; }
public List<UserGroup> UsersGroups { get; set; }
public List<Alarm> ExecutedAlarms { get; set; }
public List<Alarm> ResetedAlarms { get; set; }
public List<AccessCard> Cards { get; set; }
public List<AccessCard> UserCardsAdded { get; set; }
public List<User> UsersAdded { get; set; }
public List<Session> Sessions { get; set; }
public List<EventsLog> Events { get; set; }
public List<Reference> References { get; set; }
public List<UserPermission> UsersPermissions { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
会话控制器
[Produces("application/json")]
[Route("api/Sessions")]
public class SessionsController : Controller
{
private readonly DBContext _context;
#region CONSTRUCTOR
public SessionsController(DBContext context)
{
_context = context;
}
#endregion
#region HTTP GET
// GET: api/sessions
[HttpGet]
public async Task<IActionResult> GetSessions()
{
var sessions = await _context.Sessions.Include(s => s.User). ToListAsync();
if (sessions.Any())
{
return new ObjectResult(sessions);
}
else
{
return NotFound();
}
}
// GET: api/sessions/1
[HttpGet("{id}", Name = "GetSessionByID")]
public async Task<IActionResult> GetSessionByID(Int32 id)
{
var session = await _context.Sessions.Include(s => s.User).FirstOrDefaultAsync(s => s.IDSession == id);
if (session == null)
{
return NotFound();
}
else
{
return new ObjectResult(session);
}
}
#endregion
}
Run Code Online (Sandbox Code Playgroud)
这个想法是User模型包含List<Session>他/她创建的集合。我希望能够以其会话返回用户当然,Session模型包含一个,User因为每个会话都与一个特定的单个User相关。现在,当我需要得到所有会话对象SessionController与GetSessions()或GetSessionsByID()我使用这样邮差[HTTPGET]操作:http://localhost:8080/api/sessions它返回我是错的数据:
会话包含一个用户,而单个用户又与其会话相关。看起来它尝试Session正确地向我返回对象,包括User对象,但随后尝试包含该用户的所有会话。那不是我想要的 看起来像是某种循环。应该使用其User对象返回会话,仅此而已。我该如何实现?我在模型中犯了一些逻辑错误吗?
谢谢 !
小智 6
我最近也遇到了这个问题。因此,我通过在Startup.cs文件和ConfigureServices方法中添加此脚本来解决此问题:
services.AddMvc().AddJsonOptions(
options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
);
Run Code Online (Sandbox Code Playgroud)
因此,通过此代码为services.AddMvc()加后缀,这意味着您必须制作JSON.Net才能忽略对嵌套对象请求找到的循环。当然,还要将Newtonsoft.Json软件包安装到您的项目中,并在每个相关文件中进行引用
有关更清晰的信息,请参阅“相关数据和序列化”部分的以下链接:https : //docs.microsoft.com/zh-cn/ef/core/querying/related-data
希望对您有帮助