9

Moja metoda aktualizacji nie działa w aplikacji ASP.NET MVC 3. Użyłem następujący kod EF 4.1:context.SaveChanges nie działa

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

i SaveAccount wygląda tak:

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

czy twoje istoty są przywiązane czy odłączone? – msmucker0527

+0

Nie jestem pewien, co to znaczy przez dołączenie lub odłączenie ... – DotnetSparrow

+1

Czy możesz podać część usługi, w której rekord/obiekt jest wstawiony/zaktualizowany. Podejrzewam, że masz klauzulę użycia. –

Odpowiedz

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(); 
} 

Alternatywa:

internal void SaveAccount(Account account) { 

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

Nie robią żadnych zmian, więc nie ma naprawdę nic do zapisania. Najprostszym sposobem może być wykonanie następujących czynności:

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

    context.SaveChanges(); 
} 
2

Problem polega na tym, że nie uwzględniasz faktu, że strony internetowe są bezpaństwowcami. Prawdopodobnie spekulujesz swoją stronę danymi konta zwróconymi z bazy danych, ale obiekt jest niszczony na końcu żądania.

Po odświeżeniu, nowy obiekt Acccount jest tworzony przez segregator modelu, ale ten nie jest podłączony do bazy danych, więc kontekst bazy danych nie ma pojęcia, że ​​istnieje. Więc kiedy zadzwonisz do SaveChanges, nic się nie zmieniło.

Musisz albo pobrać nowy obiekt Konto z bazy danych i zaktualizować jego pola danymi z utworzonego Konta modelu spinacza, albo dołączyć nowy obiekt konta do bazy danych.