C# aggiornamento entity

in C#, Programmazione

Entity Framework e update

Utilizzando Entity Framework, l’update dei dati può spesso risultare difficoltoso. Il primo approccio è quello di recuperare l’entity dal db con qualche operazione di selezione, successivamente impostare il valore delle proprietà modificate ed effettuare il salvataggio sul db.

Qualcosa di simile:

using (var context = new MyDbContext())
{
     var entity = context.MyEntities.Find(id);
            
     entity.MyProperty = newEntityValues.MyProperty;
     entity.MyAProperty = newEntityValues.MyAProperty;
     entity.MyBProperty = newEntityValues.MyBProperty;
     entity.MyCProperty = newEntityValues.MyBProperty;
     entity.MyDProperty = newEntityValues.MyDProperty;
     entity.MyEProperty = newEntityValues.MyEProperty;

     context.SaveChanges();
}

Ovviamente l’utilizzo di using è consigliatissimo per poter effettuare la Dispose all’uscita del blocco.

Questo tipo di approccio, anche se funzionale, evidenzia la necessità di impostare le proprietà singolarmente: in questo caso sono state necessarie sei righe di codice ma, se il modello fosse stato più complesso, sarebbero state molte di più.

Il tutto aumentando il numero di possibili errori che, non sempre, sono di facile individuazione.

Ottimizzare il codice

Supponiamo di dover effettuare il replace dell’intero record all’interno del database. Una volta recuperato con la solita operazione selezione, possiamo utilizzare l’operatore Entry per poter effettuare l’aggiornamento. Il codice precedente diventa:

public MyEntity Update(int id, MyEntity newEntityValues)
{
   using (var context = new MyDbContext())
   {
        var entity = context.MyEntities.Find(id);
        context.Entry(entity).CurrentValues.SetValues(newEntityValues);
        context.SaveChanges();
        return entity;
   }
}

Una volta ottenuta l’entity con l’operazione di Find (il valore di Id potrebbe essere già presente all’interno di newEntityValues) l’utilizzo di .CurrentValues.SetValues(…) consente di impostare tutti i campi della entity con quelli da aggiornate. E’ quindi sufficiente effettuare la il salvataggio con la SaveChanges() e tutti i campi verranno sovrascritti. Con appena due righe di codice è stato possibile effettuare l’aggiornamento dell’intero record.

Un’altro possibile scenario può essere quello di un ViewModel che contiene i dati da aggiornare, che non necessariamente coincide con tutti i campi presenti nel db. Anche in questo caso è possibile utilizzare una un metodo simile a quello precedente:

public MyEntity Update(int id, MyEntityViewModel viewModel)
    {
        using (var context = new MyDbContext())
        {
            var entity = context.MyEntities.Find(id);
            context.Entry(entity).CurrentValues.SetValues(viewModel);
            context.SaveChanges();

            return entity;
        }
    }

In questo caso, solo le proprietà con lo stesso nome saranno aggiornate.

Questi sono solo due degli approcci che possono utilizzati per effettuare l’update di un entity senza la necessità di settare tutte le proprietà.