Nello scorso script (https://www.aspitalia.com/script/1265/Utilizzare-MongoDB-ASP.NET-Core.aspx) abbiamo introdotto l'utilizzo del database NoSql MongoDb all'interno di un'applicazione ASP.NET Core e abbiamo visto come effettuare l'inserimento di una entity in una collection. In questo script, invece, ci occuperemo delle operazioni di retrieve, update e delete, così da chiudere il cerchio delle CRUD su una entità.
Recuperare un'entità
Il driver di MongoDb per .NET offre pieno supporto a LINQ per effettuare query sul database. Il grosso vantaggio, ovviamente, è quello che non dobbiamo imparare una sintassi nuova: se abbiamo utilizzato Entity Framework in passato, infatti, saremo subito in grado di effettuare query con MongoDb.
Nel nostro caso, una action Details che recupera i dati di una person sarà simile alla seguente:
private readonly IMongoCollection<Person> _people; public async Task<IActionResult> Details(string id) { if (id == null) { return NotFound(); } var person = await _people.AsQueryable() .SingleOrDefaultAsync(x => x.Id == new ObjectId(id)); if (person == null) { return NotFound(); } return View(person); }
Il nocciolo della logica è costituito dal metodo AsQueryable che, applicato a una collection, espone tutti gli extension method di LINQ. Nell'esempio specifico, abbiamo sfruttato SingleOrDefaultAsync per effettuare una ricerca per Id. Vale la pena far notare che il driver traduce la query nella sintassi di MongoDb, così che sia il database server - e non il client - a eseguire effettivamente la query.
Riguardo alle performance, c'è da notare come questa specifica query sia estremamente veloce perchè il filtro è basato sulla chiave primaria. Più in generale, LINQ ci consente di filtrare per qualsiasi campo ma, in assenza di opportuni indici, le prestazioni degraderebbero velocemente all'aumentare delle dimensioni della base dati. Analizzaremo bene queste problematiche in un prossimo script.
Modificare un'entità
MongoDb possiede due metodi per aggiornare il contenuto di una entità esistente: Replace e Update]. Il primo consente di sostituire un documento con uno differente, mantenendo lo stesso Id. Tramite Update, invece, possiamo indicare con precisione quali sono le singole proprietà che vogliamo toccare. Sicuramente è uno strumento più utile in ambito web, perchè evita un sacco di problemi legati alla sicurezza e alla concorrenza, ma nel nostro caso di fideremo della semplice replace, utilizzata nella action di Post nel modo seguente:
[HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Edit(string id, [Bind("Name,Email")] Person person) { var original = await _people.AsQueryable() .SingleOrDefaultAsync(x => x.Id == new ObjectId(id)); if (original == null) { return this.NotFound(); } if (ModelState.IsValid && await this.TryUpdateModelAsync(original)) { await _people.ReplaceOneAsync(x => x.Id == new ObjectId(id), original); return RedirectToAction(nameof(Index)); } return View(person); }
Come possiamo vedere, innanzitutto recuperiamo, con la stessa tecnica vista prima, la versione originale della entità Person, sollevando un 404 nel caso non sia stata trovata. Poi ne modifichiamo il contenuto tramite il metodo TryUpdateModelAsync, che recupera i valori postati nella request. L'ultimo passo è quello di salvare i dati con ReplaceOneSync, che accetta come argomento la query per recuperare l'elemento da sovrascrivere e il nuovo valore.
Eliminare un'entità
L-ultima operazione che ci è rimasta da analizzare è la Delete. Questa può essere implementata sfruttando il metodo DeleteOneAsync:
[HttpPost, ActionName("Delete")] [ValidateAntiForgeryToken] public async Task<IActionResult> DeleteConfirmed(string id) { var person = await _people.DeleteOneAsync(x => x.Id == new ObjectId(id)); return RedirectToAction(nameof(Index)); }
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Ottimizzare serializzazione e deserializzaione tramite le options con System.Text.Json
Utilizzare l'attributo autofill del CSS
Catturare la telemetria degli eventi di output cache in ASP.NET Core
Utilizzare i WebSocket con Azure API Management
Velocizzare l'installazione delle dipendenze in un workflow di GitHub
Permettere l'append ai file di un Azure Storage immutabile
Migrare un progetto ASP.NET Core da .NET 6 a .NET 7
Applicare il versioning ai nostri endpoint ASP.NET Core Minimal API
Raggruppare i parametri di una minimal API in un singolo oggetto in ASP.NET Core
Usare ASP.NET Core dev tunnels per testare le applicazioni su internet
Definire la durata dell'output cache in ASP.NET Core 7
Leggere i dati di configurazione di ASP.NET Core da Azure Key Vault
I più letti di oggi
- Utilizzare HiLo per ottimizzare le insert in un database con Entity Framework
- Filtrare e rimuovere gli elementi dalla cache del browser tramite le API JavaScript
- Ottenere il contenuto di una cartella FTP con la libreria FluentFTP
- Controllare gli accessi IP alle app con Azure Container Apps
- Effettuare il deploy di immagini solo da container registry approvati in Kubernetes
- Elencare le container images installate in un cluster di Kubernetes
- Recuperare un elemento inserito nella cache del browser tramite API JavaScript
- .NET Conference Italia 2022 - Milano e Online
- Utilizzare le Cache API di JavaScript per salvare elementi nella cache del browser