venerdì 18 novembre 2011

Come aggiornare i dati in LINQ-to-SQL

L'approccio che ha LINQ all'aggiornamento dei dati non è del tutto intuitivo, soprattutto per chi è abituato a lavorare con SQL standard. Leggere, inserire ed eliminare è molto semplice, ma aggiornare i dati presuppone che ciò che stiamo aggiornando sia noto da DataContest di riferimento.
var prodotto = (from p in dataContext.Prodotti
               where p.IDProdotto == 1
               select p).Single();

prodotto.Name = "Il mio prodotto";

dataContext.SubmitChanges();
Come possiamo però aggiornare i dati in un database senza necessariamente doverne fare una select prima di poterli modificare?

Nella documentazione MSDN troviamo la risposta a questa domanda.

Q. Can I update table data without first querying the database?
A. Although LINQ to SQL does not have set-based update commands, you can use either of the following techniques to update without first querying:
  • Use ExecuteCommand to send SQL code.
  • Create a new instance of the object and initialize all the current values (fields) that affect the update. Then attach the object to the DataContext by using Attach and modify the field you want to change.

Il primo metodo è quello di utilizzare dei Comandi SQL (lascio a voi la valutazione sull'opportunità di questa opzione), mentre il secondo, molto più interessante, sfrutta il concetto di attaccare un oggetto ad uno specifico contesto tramite la funzione ATTACH del DataContext.

Ci sono un po' di considerazioni da fare però su questo metodo di aggiornamento dei dati. Ovviamente nel caso in cui ci siano dei tipi di dati particolari nella tabella in cui facciamo l'aggiornamento (date, campi obbligatori, ecc.) dobbiamo necessariamente valorizzare le proprietà dell'oggetto o potremmo avere dei messaggi di errore al momento del SubmitChanges.
var prodotto = new Prodotto();
prodotto.IDProdotto = 1;
prodotto.Name = "Biscotti salati";
prodotto.ProductNumber = "PR-10001";
prodotto.SellStartDate = DateTime.Parse("6/1/2011 12:00:00 AM");
prodotto.SellEndDate = null;

Prodotti.Attach(prodotto);

// Make the change here
prodotto.Name = "Biscotti dolci";

SubmitChanges();
Di seguito una serie di link in cui viene approfondito l'argomento:








Nessun commento: