9

Il mio metodo di aggiornamento non funziona in un'applicazione ASP.NET MVC 3. Ho usato il seguente codice di EF 4.1:context.SaveChanges not working

[HttpPost] 
public ActionResult UpdateAccountDetails(Account account) 
{ 
    if (ModelState.IsValid) 
    { 
     service.SaveAccount(account); 
    } 
} 

e SaveAccount si presenta così:

internal void SaveAccount(Account account) {   
    context.SaveChanges(); 
} 
+1

le tue entità sono collegate o staccate? – msmucker0527

+0

Non sono sicuro di cosa significhi collegato o scollegato ... – DotnetSparrow

+1

Puoi fornire la parte del servizio in cui il record/entità viene inserita/aggiornata. Ho il sospetto che tu abbia una clausola di utilizzo. –

risposta

12
internal void SaveAccount(Account account) { 

    // Load current account from DB 
    var accountInDb = context.Accounts.Single(a => a.Id == account.Id); 

    // Update the properties 
    context.Entry(accountInDb).CurrentValues.SetValues(account); 

    // Save the changes 
    context.SaveChanges(); 
} 

Alternativa:

internal void SaveAccount(Account account) { 

    context.Entry(account).State = EntityState.Modified; 
    context.SaveChanges(); 
} 
1

non stanno facendo alcuna modifica, quindi non c'è davvero nulla da salvare. Il modo più semplice può essere la seguente procedura:

internal void SaveAccount(Account account) 
{ 
    context.Attach(account); 
    ObjectStateEntry entry = context.ObjectStateManager.GetObjectStateEntry(account); 
    entry.SetModified(); 

    context.SaveChanges(); 
} 
2

Il problema qui è che non si sta tenendo conto del fatto che le pagine web sono apolidi. Probabilmente crimini la tua pagina con i dati dell'account restituiti dal database, ma poi l'oggetto viene distrutto alla fine della richiesta.

Nel postback, un nuovo oggetto Acccount viene creato dal raccoglitore modello, ma questo non è collegato al database, quindi il contesto del database non ha alcuna idea che esista. Quindi quando chiami SaveChanges, nulla è cambiato per quanto lo riguarda.

È necessario ottenere un nuovo oggetto Account dal database e aggiornare i suoi campi con i dati dal raccoglitore modello creato Account o associare il nuovo oggetto account al database.