Ricevo questo messaggio:
System.ObjectDisposedException: impossibile accedere a un oggetto eliminato. Una causa comune di questo errore è l'eliminazione di un contesto che è stato risolto dall'iniezione delle dipendenze e successivamente il tentativo di utilizzare la stessa istanza di contesto altrove nell'applicazione. Ciò può verificarsi se si chiama Dispose () sul contesto o si avvolge il contesto in un'istruzione using. Se si utilizza l'iniezione di dipendenza, è necessario lasciare che il contenitore di iniezione di dipendenza si occupi di eliminare le istanze di contesto.
controller:
[HttpGet]
public IActionResult GetAllTags()
{
try
{
return Ok(GetAll());
}
catch(Exception ex)
{
return ControllerHelper.LogAndReturnBadRequest(_logger, ex);
}
}
private IEnumerable<TagDto> GetAll()
{
IEnumerable<TagDto> tags;
if (!_cache.TryGetValue(CacheKeys.States, out tags))
{
tags = _service.GetAll()?.Select(t => _mapper.Map<TagDto>(t));
if(tags != null)
_cache.Set(CacheKeys.States, tags);
}
return tags;
}
Startup.cs
services.AddMemoryCache();
Stavo eseguendo il debug del codice riga per riga, ma anche dopo l'ultima riga del mio codice, non c'è alcun errore.
L'errore che ho visto era nella console di Kestrel. Vale la pena notare che l'errore si verifica solo durante il recupero dei tag da _cache, non si verifica la prima volta quando i tag vengono prelevati direttamente dal database.
Ecco cosa ho ricevuto dalla richiesta Postman:
Molte domande simili si riferiscono a oggetti dispose, ma qui puoi vedere che non ho dispose () o che usa () nel mio codice.
Suppongo sia necessario idratare i risultati della query prima di archiviarli nella cache. Linq utilizza l' esecuzione differita , il che significa che la fonte sottostante non verrà effettivamente interrogata fino a quando non si tenta di enumerare i risultati. Quindi stai solo memorizzando una query nella cache e quando provi a recuperare i dati effettivi, il contesto sottostante viene eliminato.
Aggiungi una ToList
alla tua query e archivia l'elenco nella cache:
tags = _service.GetAll()?.Select(t => _mapper.Map<TagDto>(t)).ToList();
Vorrei anche notare che il risultato di una query linq che restituisce una sequenza non sarà mai nullo. Potrebbe essere vuoto , quindi se non si desidera memorizzare nella cache un risultato vuoto, è possibile modificare il controllo null in if (tags.Any())
.