【发布时间】:2018-07-03 04:25:54
【问题描述】:
我正在 .NET 核心中构建 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; }
}
用户模型
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; }
}
会话控制器
[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
}
这个想法是User 模型包含他/她创建的List<Session> 集合。我希望能够通过会话返回用户
当然Session 模型包含一个User,因为每个会话都与一个特定的单个用户相关。
现在,当我需要使用GetSessions() 或GetSessionsByID() 获取SessionController 中的所有会话对象时,我使用这样的POSTMAN [HttpGet] 操作:http://localhost:8080/api/sessions 返回错误的数据:
一个会话包含一个用户,而单个用户又与其会话相关。看起来它试图正确地返回我Session 对象,包括User 对象,但随后它试图包括该用户的所有会话。那不是我想要的。它看起来像某种循环。会话应该与其用户对象一起返回,仅此而已。我怎样才能做到这一点?我在我的模型中犯了一些逻辑错误吗?
谢谢!
【问题讨论】:
标签: json entity-framework-core postman asp.net-core-webapi