Sto creando un server REST API in .NET core. Sto testando il mio codice tramite il software Postman. Ho un problema con il metodo Include()
che mi consente di allegare i dati delle proprietà di navigazione. Sto cercando di ottenere i dati nell'azione [HttpGet] e gli oggetti che vengono restituiti sono sbagliati.
Il mio codice: MODELLI
Modello di sessione
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; }
}
Modello utente
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; }
}
Controller di sessione
[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
}
L'idea è che il modello User
contenga la raccolta List<Session>
che lui / lei ha creato. Voglio essere in grado di restituire agli utenti le sessioni. Naturalmente il modello di Session
contiene un singolo User
perché ogni sessione è correlata a un singolo utente specifico. Ora, quando ho bisogno di ottenere tutti gli oggetti delle sessioni in SessionController
con GetSessions()
o GetSessionsByID()
uso POSTMAN [HttpGet] in questo modo: http://localhost:8080/api/sessions
che mi restituisce dati errati:
Una sessione contiene un utente e a sua volta un singolo utente è correlato con le sue sessioni. Sembra che cerchi di restituire correttamente l'oggetto Session
, include l'oggetto User
ma poi tenta di includere tutte le sessioni per quell'utente. Non è quello che voglio. Sembra una specie di loop. Le sessioni devono essere restituite con i relativi oggetti Utente e il gioco è fatto. Come posso ottenerlo? Sto facendo qualche errore logico nei miei modelli?
Grazie !
Ho incontrato anche questo problema di recente. Quindi, l'ho risolto aggiungendo questo script nel file Startup.cs e nel metodo ConfigureServices:
services.AddMvc().AddJsonOptions(
options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
);
Quindi, aggiungi suffisso services.AddMvc () con questo codice, il che significa che devi fare in modo che JSON.Net ignori i cicli rilevati nella richiesta di oggetto nidificato. E ovviamente avere il pacchetto Newtonsoft.Json installato sul progetto e referenziato in ogni file interessato
Per informazioni molto più chiare, consultare questo link nella sezione Dati correlati e serializzazione: https://docs.microsoft.com/en-us/ef/core/querying/related-data
Spero che questo ti sia utile