Sto guardando alcuni tutorial sulla programmazione del nucleo di asp.net
In alcuni tutorial i docenti usano questo codice per aggiornare i dati nel database
DataContext db = new DataContext();
var query = db.TblUsers.where(x => x.Id == 3).single();
query.Name = "Sami";
db.TblUsers.Attach(query);
db.Entry(query).state = EntityState.Modified;
db.SaveChanges();
Ma alcuni docenti usano questo codice per aggiornare i dati nel database
DataContext db = new DataContext();
var query = db.TblUsers.where(x => x.Id == 3).single();
query.Name = "Sami";
db.Update(query);
db.SaveChanges();
In effetti sono confuso da usare quale di loro? Perché entrambi i codici funzionano.
Per favore dimmi che cosa è esattamente diverso tra quei codici?
Per il codice corrente, non è necessario utilizzare Attach
per la prima. Se si desidera aggiornare il modello recuperando record dal database, si consiglia di utilizzare la seconda via, che è molto più comoda.
Per Attach
, inserisce l'entità nel grafico nello stato Invariato e imposta l'entità come Modified
da db.Entry(query).state = EntityState.Modified
, quindi le modifiche nella query
verranno salvate nel database. Poiché db.TblUsers.where(x => x.Id == 3).single()
sta già monitorando la query
, non è necessario utilizzare Attach
.
Esistono due tipi di query, tracking
e no-tracking
. Se non hai specificato la query come no-tracking
impeccabile come db.TblUsers.AsNoTracking().where(x => x.Id == 3).single()
, l'entità db.TblUsers.AsNoTracking().where(x => x.Id == 3).single()
stato Unchanged
.
Per db.Update(query);
, inizierà a monitorare l'entità specificata nello stato EntityState.Modified
tale che verrà aggiornato nel database quando viene chiamato Microsoft.EntityFrameworkCore.DbContext.SaveChanges.