Ho esplorato diversi metodi di modifica / aggiornamento di un record all'interno di Entity Framework 5 in un ambiente ASP.NET MVC3, ma finora nessuno di essi ha spuntato tutte le caselle di cui ho bisogno. Spiegherò perché.
Ho trovato tre metodi ai quali citerò i pro e i contro:
Metodo 1: carica il record originale, aggiorna ogni proprietà
var original = db.Users.Find(updatedUser.UserId);
if (original != null)
{
original.BusinessEntityId = updatedUser.BusinessEntityId;
original.Email = updatedUser.Email;
original.EmployeeId = updatedUser.EmployeeId;
original.Forename = updatedUser.Forename;
original.Surname = updatedUser.Surname;
original.Telephone = updatedUser.Telephone;
original.Title = updatedUser.Title;
original.Fax = updatedUser.Fax;
original.ASPNetUserId = updatedUser.ASPNetUserId;
db.SaveChanges();
}
Professionisti
- Può specificare quali proprietà cambiano
- Le viste non devono contenere tutte le proprietà
Contro
- 2 query sul database per caricare l'originale, quindi aggiornarlo
Metodo 2: carica il record originale, imposta i valori modificati
var original = db.Users.Find(updatedUser.UserId);
if (original != null)
{
db.Entry(original).CurrentValues.SetValues(updatedUser);
db.SaveChanges();
}
Professionisti
- Solo le proprietà modificate vengono inviate al database
Contro
- Le viste devono contenere ogni proprietà
- 2 query sul database per caricare l'originale, quindi aggiornarlo
Metodo 3: collegare il record aggiornato e impostare lo stato su EntityState.Modified
db.Users.Attach(updatedUser);
db.Entry(updatedUser).State = EntityState.Modified;
db.SaveChanges();
Professionisti
- 1 x query sul database da aggiornare
Contro
- Impossibile specificare quali proprietà cambiano
- Le viste devono contenere ogni proprietà
Domanda
La mia domanda a voi ragazzi; esiste un modo chiaro per raggiungere questo insieme di obiettivi?
- Può specificare quali proprietà cambiano
- Le viste non devono contenere tutte le proprietà (come la password!)
- 1 x query sul database da aggiornare
Capisco che è una cosa abbastanza piccola da sottolineare, ma potrei mancare una soluzione semplice a questo. Altrimenti prevarrà il metodo uno ;-)